PHP套接字应该返回json,但返回警告

PHP套接字应该返回json,但返回警告,php,json,sockets,Php,Json,Sockets,以前从未使用过插座。我必须制作套接字才能从服务器获得json格式的答案。这是代码: $host = '11.11.11.1';//for example $port = 1111; $message = "xgm"; set_time_limit(2); if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))) { $errorcode = socket_last_error(); $errormsg = socket_

以前从未使用过插座。我必须制作套接字才能从服务器获得json格式的答案。这是代码:

$host = '11.11.11.1';//for example
$port = 1111;
$message = "xgm";
set_time_limit(2);
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
if(!socket_connect($sock , $host , $port))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not connect: [$errorcode] $errormsg \n");
}
echo "Connection established \n";
if( ! socket_send ( $sock , $message , strlen($message) , 0))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not send data: [$errorcode] $errormsg \n");
}
echo "Message send successfully \n";
if(socket_recv ( $sock , $buf , 2045 , MSG_WAITALL ) === FALSE)
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not receive data: [$errorcode] $errormsg \n");
}


var_dump($buf);
socket_close($sock);
这是我得到的回应:

  • 创建套接字
  • 建立连接
  • 消息发送成功
  • 警告:套接字_recv():无法从套接字[10045]读取:对象类型不支持尝试的操作
    参考。在C:\wamp64\www\json\index.php的第73行
  • 无法接收数据:[10045]引用的对象类型不支持尝试的操作

因此,socket_recv似乎返回false。为什么?这是因为服务器响应的json对象吗?如何解决这个问题?任何方向?

UDP与TCP不同,它是一种无连接协议,这意味着两端可以交换消息,而无需建立通信通道。
因此,最好使用
socket\u recvfrom
socket\u sendto
,因为它们与不面向连接的套接字配合使用

$host = '11.11.11.1';//for example
$port = 1111;
$message = "xgm";
set_time_limit(2);
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))){
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";

if(!socket_sendto($sock, $message, strlen($message), 0, $host, $port)){
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not send data: [$errorcode] $errormsg \n");
}
echo "Message send successfully \n";

if(socket_recvfrom($sock , $buf , 2045 , 0, $host, $port) === FALSE){
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not receive data: [$errorcode] $errormsg \n");
}
var_dump($buf);
socket_close($sock);

这就是全部代码吗?作为socket_recv函数的第二个参数传递的$buf的值是多少?我相信您需要将套接字绑定到本地端口以接收UDP数据包。使用
socket\u绑定($sock,$address,$port)
抱歉,响应太慢。你的回答有道理。