マルチキャスト パケットを送信するアプリケーションがあります。
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