ホームページ > バックエンド開発 > PHPチュートリアル > UDP エラー パッケージの問題_PHP チュートリアル

UDP エラー パッケージの問題_PHP チュートリアル

WBOY
リリース: 2016-07-14 10:07:34
オリジナル
1509 人が閲覧しました

質問

以下のコードを見てください
$word = 'こんにちは';
$conf = 配列(
array('ip'=>'10.1.146.133', 'port'=>2001),
配列('ip'=>'10.1.146.133', 'ポート'=>2002)
);
関数 udpGet($word, $ip, $port)
{
$sock =socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>2, 'usec'=>0));
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>2, 'usec'=>0));
socket_sendto($sock, $word, strlen($word), 0x100, $ip, $port);
socket_recvfrom($sock, $result, 8192, 0, $host, $port);
socket_close($sock);
$result を返す;
}
for ($i=0; $i
{
$res = udpGet($word, $conf[$i]['ip'], $conf[$i]['port']);
var_dump($res);
}
UPD を継続的に使用して 2 つのサーバーにデータを送受信することです (問題を説明するために、ここでのサーバーは最も単純なリフレクション ロジックを使用しています)。
すべてが正常に進むと、クライアントは「HELLO」を 2 回受け取ります。しかし、サーバー側で何か問題が発生した場合はどうなるでしょうか?
現在、クライアントのタイムアウトは 2 秒です。ポート 2001 は 3 秒後にデータを送信しますが、ポート 2002 はサービスを提供できないとします。
結果はどうなるか予想しますか? 「NULL が 2 つある!」というのが直感的な答えです。あなたもそう思ったら
おめでとうございます、答えは間違っていました。
実際の答えは次のとおりです:
ヌル
文字列(5) "HELLO"
分析
tcpdumpを使用してパケットをキャプチャし、次の結果を取得します
(133はサーバー、163はクライアント、クライアントphpバージョン5.3.1、Linuxカーネル2.6.16)
12:01:39.014658 IP 10.1.146.163.40678 > 10.1.146.133.2001: UDP、長さ 5
12:01:41.015121 IP 10.1.146.163.40678 > 10.1.146.133.2002: UDP、長さ 5
12:01:42.016103 IP 10.1.146.133.2001 > 10.1.146.163.40678: UDP、長さ 5
私の考えによれば、2 つのリクエストは送信と受信に異なる一時ポートを使用する必要がありますが、パケット キャプチャの結果から判断すると、
クライアントはsocket_createを2回実行しましたが、実際には同じ一時ポート(40678)が使用されました
データを送受信しましょう!これにより、2 番目のリクエストが最初のリクエストからの応答パケットを受信します。
これはシステムのバグとみなすべきだと思われますが、実験の結果、この問題は一部のシステムにのみ存在することが判明しました。
たとえば、Linux カーネル 2.6.32+php5.2.3 にはこの問題はありません。
解決策
送受信の都度ソケットポートを指定します。以下の赤いコードに示されているように。
$sock =ソケット_作成(AF_INET, SOCK_DGRAM, SOL_UDP);
$sendPort = rand(10240, 60000);
socket_bind($sock, ’10.1.146.163’, $sendPort);
socket_set_option($sock, SOL_SOCKET, SO_SNDTIMEO, array(‘sec’=>2, ‘usec’=>0));
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array(‘sec’=>2, ‘usec’=>0));
もちろん、ランドポートも衝突する可能性はありますが、結局のところ、確率は低く、問題はかなり解決できます。
より良い解決策があれば、ぜひ共有してください〜
�0�2
�0�2
http://www.bkjia.com/PHPjc/477851.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477851.html技術記事問題は次のとおりです: $word = HELLO; $conf = array(array(ip=10.1.146.133, port=2001), function udpGet($word, $); ip , $port) { $sock = ソケット...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート