1

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

何が原因でしょうか?.入力を入力した後、「Reply : [random input]」の代わりに上記の最後の行が表示されます。

前もって感謝します

4

1 に答える 1

1

socket_recv 関数で "MSG_WAITALL" の代わりにこのフラグ "MSG_PEEK" を使用します。ありがとうございました。

于 2015-01-04T06:33:53.057 に答える