2

マルチキャスト パケットを送信するアプリケーションがあります。

BlockingCollection を使用して、送信する必要があるメッセージを保存します。次に、このコレクションを繰り返し処理してメッセージを送信する専用のスレッドを作成します。各 IP で送信する必要があるため、ローカル IP ごとにソケットがあります。

通常は問題なく動作しますが、最近、スレッドが Socket.SendTo 呼び出しでハングすることが何度かあり、アプリケーションが外部呼び出しに応答しなくなりました。私の BlockingCollection はますます大きくなり、決して処理されません。

私の呼び出しをブロックしているこの Socket.SendTo 呼び出しを行う理由が見つかりません。TCP 呼び出しの場合、相手側には誰もいないと想像できますが、UDP の場合、考えられる問題はありません。

私のコードは基本的に次のとおりです。

Debug.WriteLine("Sending message on local endpoint " + socket.Key + ", to " + remoteEndpoint);
int sendTo = socket.Value.SendTo(buffer, remoteEndpoint);
Debug.WriteLine("Successfully sent a packet with "+sendTo+" bytes");

私のログには次のように表示されます。

[...]
Sending message on local endpoint 10.10.23.56, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 10.9.53.38, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 127.0.0.1, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 10.10.23.56, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 10.9.53.38, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 127.0.0.1, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 10.10.23.56, to 224.0.0.253:5353
Successfully sent a packet with 778 bytes
Sending message on local endpoint 10.9.53.38, to 224.0.0.253:5353¨

次のようにソケットを作成します。

Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255);
sendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sendSocket.MulticastLoopback = true;
sendSocket.Bind(new IPEndPoint(localAddress, m_port));
sendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,new MulticastOption(m_multicastAddress, localAddress));

すべてのメッセージが送信されるまでブロックされていることがわかりましたが、どのような理由でメッセージがこのようにブロックされるのでしょうか? しかし、ここで、私の電話がここでブロックされるのは数分です。

そして、何をすべきか?ソケットを破棄して、パケットが送信されないときにもう一度作成してみてください。

編集: 非同期送受信で同じことをしようとしましたが、さらに悪い: EndReceiveTo でブロックされますが、さらに、プロセスを強制終了できません (アクセスが拒否され、管理者であり、再起動する必要がありました: /)

EDIT xaxxonの回答の後、メッセージを送信する前にこれを入れて、書き込みできないソケットがあるかどうか、またはエラーがあるかどうかを確認します。

List<Socket> socketWrite = socketToUse.Select(s => s.Value).ToList();
List<Socket> socketError = socketToUse.Select(s => s.Value).ToList();
Socket.Select(null, socketWrite, socketError, 1000);
Console.WriteLine("Writeable sockets: " + String.Join(", ", socketWrite.Select(s => s.LocalEndPoint.ToString())));
Console.WriteLine("Sockets in errors: " + String.Join(", ", socketError.Select(s => s.LocalEndPoint.ToString())));

But before I enter I get stuck  on my `SendTo` call, 
Writeable sockets: 10.10.23.56:5353, 10.9.53.38:5353, 127.0.0.1:5353
Sockets in errors:
Sending message on local endpoint 10.10.23.56, to 224.0.0.253:5353
Successfully sent a packet with 93 bytes
Sending message on local endpoint 10.9.53.38, to 224.0.0.253:5353
Successfully sent a packet with 93 bytes
Sending message on local endpoint 127.0.0.1, to 224.0.0.253:5353
Successfully sent a packet with 93 bytes
Writeable sockets: 10.10.23.56:5353, 10.9.53.38:5353, 127.0.0.1:5353
Sockets in errors:
Sending message on local endpoint 10.10.23.56, to 224.0.0.253:5353
Successfully sent a packet with 1162 bytes
Sending message on local endpoint 10.9.53.38, to 224.0.0.253:5353
__HERE I GET STUCK
4

2 に答える 2

2

TCP ソケットと同様に、UDP ソケットにも発信 (送信) バッファーがあります。その送信バッファがいっぱいになると、sendTo() 呼び出しもブロックされます。SO_SNDBUF ソケット オプションを設定して、発信送信バッファーのサイズを増やすことができます。さらに別の理由は、ARP を解決する必要がある場合です。これは、ルートのネクスト ホップまたは宛先自体が同じサブネット内にあり、ARP エントリがない場合に発生する可能性があります。ARP 解決は ARP 要求/ARP 応答で構成されるため、ARP 応答を受信するまでに、送信者は送信バッファーを満たすのに十分なパケットをキューに入れている可能性があります。SO_SNDBUF を徐々に増やして、発生している問題がそれほど深刻ではないかどうかを確認します。これにより、送信バッファが実際にブロッキングの問題の原因であることを特定できます。

SO_SNDBUF の設定について説明しているリンクを次に示します。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx

于 2013-09-13T17:06:13.190 に答える