2017-10-11 3 views
0

他のすべての書き込みに拒否したgolang UDP接続は、私はUbuntuのLinuxの16.04でこのUDPクライアントプログラムを実行した

$ go run server.go 
1 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 
3 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 
5 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 

をしかし、私は代わりに、この出力を期待:

$ go run server.go 
1 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 
2 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 
3 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 
4 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 
5 write udp 127.0.0.1:58703->127.0.0.1:10001: write: connection refused 

tcpdumpは:

15:28:46.453313 IP localhost.47993 > localhost.10001: UDP, length 1 
15:28:46.453338 IP localhost > localhost: ICMP localhost udp port 10001 unreachable, length 37 
15:28:48.453821 IP localhost.47993 > localhost.10001: UDP, length 1 
15:28:48.453852 IP localhost > localhost: ICMP localhost udp port 10001 unreachable, length 37 
15:28:50.454242 IP localhost.47993 > localhost.10001: UDP, length 1 
15:28:50.454271 IP localhost > localhost: ICMP localhost udp port 10001 unreachable, length 37 

これはいつも毎回conn.Writeが毎回代わりに書き込みを行うのはなぜですか?私は非難するつもりはない、私はちょうど理由を学びたい。あなたは、パケットキャプチャをより詳しく見ると

+0

サーバーが接続をどのように処理するかを共有できますか?ブロックされているように見えるか、そのようなものです。 –

+0

要件がない限り、接続されたUDPソケットを使用しないことをお勧めします。 – JimB

+0

@JimBこの "接続されたUDPソケット"とは何ですか?私はUDPがコネクションレスであると思いましたか?彼らはどこでそれを避けるのが一般的ですか? – selden

答えて

4

、あなたはそれあるは、ICMP到達不能ですべてのパケットに応答することに気づくでしょう、そしてあなただけの他のすべてのパケットを送信しています。戻り値をWriteから調べると、他のすべてのパケットにデータが書き込まれていないこともわかります。

UDPは実際に接続されておらず、送信されたパケットにはACKがないので、送信エラーをシミュレートするのに最適な「接続済み」UDPソケットは、ICMP応答を保存し、次の書き込み。

最初のパケットが送信され、ICMP到達不能メッセージが受信され、2回目の送信操作が失敗し、エラーが返され、パケットは送信されず、サイクルが繰り返されます。

関連する問題