2017-12-07 3 views
0

警告リターンを返すshoud。私はjson形式のサーバーから答えを得るためにソケットを作らなければなりません。これはコードです:PHPソケットは、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); 

そして、これは私が得る応答である:

  • ソケットが
  • 接続が
  • メッセージ送信に成功
  • 警告確立作成:socket_recv():にできないしソケットから読み出し[10045]:試行された操作は、オブジェクト
    REFのタイプはサポートされていません勃起した。 Cで:ライン73
  • の\ wamp64 \ WWW \のJSONの\のindex.phpは、データを受信できませんでした:[10045]しようとした操作は、参照されるオブジェクトのタイプはサポートされていません。

したがって、socket_recvがfalseを返すようです。どうして?それはサーバーからの応答でjsonオブジェクトのためですか?それを修正する方法は?どんな方向?

+0

これは、コードのすべてのですか? socket_recv関数の第2引数として渡される$ bufの値は? – mrjamesmyers

+0

UDPパケットを受信するには、ソケットをローカルポートにバインドする必要があります。 'socket_bind($ sock、$ address、$ port) 'を使用してください。 – avy

答えて

0

TCPとは異なり、UDPは、両端が通信チャネルをestablichすることなく、メッセージを交換できることを意味するコネクションレスプロトコルです。
だから、それは彼らがいない接続指向のソケットでうまく動作するのでsocket_recvfromsocket_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); 
+0

遅い応答には申し訳ありません。あなたの答えは理にかなっています。 –

関連する問題