Socket_read()表示"不是有效的资源"

时间:2015-03-15 12:32:39

标签: php sockets

我正在学习socket编程和使用php进行实验。 我想使用客户端连接到套接字服务器,并从客户端读取服务器的响应。

代码:

Server.php:

$address="127.0.0.1";
$port=3343;
echo "I am here";
set_time_limit (0);
if(false==($socket=  socket_create(AF_INET,SOCK_STREAM, SOL_TCP)))
{
    echo "could not create socket";
}
socket_bind($socket, $address, $port) or die ("could not bind socket");
socket_listen($socket);
if(($client=socket_accept($socket)))
    socket_write($client, "Welcome!!", 1024);

socket_close($socket);

Client.php

$host="127.0.0.1" ;
$port=3343;
$timeout=30;
$sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ;
if (!is_resource($sk)) {
    exit("connection fail: ".$errnum." ".$errstr) ;
} else {
    echo socket_read($sk, 256);
    //echo "Connected";
}

连接时,

服务器输出:

I am here

客户输出:

Warning: socket_read(): supplied resource is not a valid Socket resource in C:\xampp\htdocs\users\srv\test\client.php on line 16

2 个答案:

答案 0 :(得分:1)

在这里发现了问题。

socket_read()不适用于尚未使用socket_create()创建的套接字。

工作代码:

$host="127.0.0.1" ;
$port=3343;
$timeout=30;
$sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ;
if (!is_resource($sk)) {
    exit("connection fail: ".$errnum." ".$errstr) ;
} else {
    while (!feof($sk)) echo fgets($sk, 256); //This does the trick
    //echo "Connected";
}

答案 1 :(得分:1)

您正在混合资源类型。

fsockopen返回文件指针。您需要在其上使用freadfwrite等,而不是socket_read

socket_read接受使用socket_createsocket_accept

创建的套接字资源

PHP手册页中的fsockopen示例:

<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
    echo "ERROR: $errno - $errstr<br />\n";
} else {
    fwrite($fp, "\n");
    echo fread($fp, 26);
    fclose($fp);
}
?>

fsockopen reference

socket_read reference