用 PHP 进行 UDP 套接字编程


udp socket programming in php

我正在尝试在Windows cmd上运行udp套接字。这是我的服务器脚本。

<?php
error_reporting(~E_WARNING);
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg 'n");
}
echo "Socket created 'n";
// Bind the source address
if( !socket_bind($sock, '0.0.0.0' , 80) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg 'n");
}
echo "Socket bind OK 'n";
while(1)
{
echo "Waiting for data ... 'n";
//Receive some data
$r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
echo "$remote_ip : $remote_port -- " . $buf;
//Send back the data to the client
socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);
}
socket_close($sock);

我在运行上述脚本时得到如下响应:

Socket created 
Socket bind OK 
Waiting for data ...

下面是我的客户端脚本。

<?php
error_reporting(~E_WARNING);
$server = '127.0.0.1';
$port = 9999;
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg 'n");
}
echo "Socket created 'n";
while(1)
{
//Take some input to send
echo 'Enter a message to send : ';
$input = fgets(STDIN);
//Send the message to the server
if( ! socket_sendto($sock, $input , strlen($input) , 0 , $server , $port))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not send data: [$errorcode] $errormsg 'n");
}
//Now receive reply from server and print it
if(socket_recv ( $sock , $reply , 2045 , MSG_WAITALL ) === FALSE)
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Could not receive data: [$errorcode] $errormsg 'n");
}
echo "Reply : $reply";
}

在运行上述套接字时,我得到以下输出。

Socket created
Enter a message to send:[random input]
Could not receive data:[0] The operation completed successfully

这是什么原因造成的?..输入一些输入后,将显示上面的最后一行,而不是"回复:[随机输入]"

提前致谢

socket_recv函数中使用此标志"MSG_PEEK"而不是"MSG_WAITALL"。谢谢。