以下の流れで、ニコニコ生放送のコメントを取得しようとしています。
1.ある放送の放送ID(lv〜)をいれる
2.ニコ生にログイン
3.クッキー情報を取得
4.クッキー情報からセッションを取得
5.コメントサーバー情報(サーバーアドレス、ポート、スレッドID)を取得
6.ソケットを作成し、取得したアドレス、ポートで接続
7.スレッドIDを埋め込んだ文字列を送信
8.受信データからコメント取得
以下は、サーバーアドレス、ポート、スレッドを取得して、変数に入れるところからのコードです。
PHP
1// サーバーアドレス 2$addr = $xmlAry['ms']['addr']; 3// ポート 4$port = $xmlAry['ms']['port']; 5//スレッド 6$thread = $xmlAry['ms']['thread']; 7 8//送信するメッセージ 9$msg_format = '<thread thread="%s" version="(20061206|20090904)" res_from="-10" scores="1"/>\0'; 10 11$msg = sprintf($msg_format,(string)$thread); 12 13$res = ''; 14 15//ソケット作成 16$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 17 18if ($socket == true) { 19 20 // ソケット接続 21 $connect_result = socket_connect($socket,$addr,$port); 22 23 if ($connect_result === true) { 24 25 $write_result = socket_write($socket, $msg, strlen($msg)); 26 27 if ($write_result == true){ 28 29 $res = '送信しました。'.PHP_EOL; 30 31 }else{ 32 33 //socket_strerror:ソケットエラーの内容を文字列として返す 34 //socket_last_error:ソケットの直近のエラーを返す 35 $res = 'socket_write() 失敗: '.socket_strerror(socket_last_error($socket)).PHP_EOL; 36 37 } 38 39 }else{ 40 $res = 'socket_connect() 失敗: '.socket_strerror(socket_last_error($socket)).PHP_EOL; 41 } 42}else{ 43 $res = 'socket_create() 失敗: '.socket_strerror(socket_last_error()).PHP_EOL; 44 45} 46 47$buf = 'This is my buffer.'; 48 49if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_DONTWAIT))) { 50 echo "Read $bytes bytes from socket_recv(). Closing socket..."; 51} else { 52 var_dump($bytes); 53 echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n"; 54} 55 56socket_close($socket); 57
今、7までコーディングが終わっていて、7で文字列を送信した際に受け取るデータ(コードでいうと、$bytes)がNULLとなってしまっていて、以下のようなエラーが出ています。
「socket_recv() failed; reason: Resource temporarily unavailable」
尚、5でサーバーアドレス、ポート、スレッドIDを取得し、6、7でソケット接続し、メッセージ文字列が送信ができているのを確認しています。
あなたの回答
tips
プレビュー