1

その場で UdpClient の IP アドレスを変更する方法はありますか? StartUpd()投げる

System.Net.Sockets.SocketException: 通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) の 1 つの使用のみが許可されます

をした後でもStopUpd()

private static UdpClient udpClientR;
void StartUpd()
{
    try
    {
        udpClientR = new UdpClient();
        udpClientR.Connect(Settings.rxIPAddress, PORT_RX_LOCAL);
        var t1 = new Thread(() => UdpReceiveThread(PORT_RX_REMOTE)) 
        { IsBackground = true };
        t1.Start();
        ...

private void StopUpd()
{
    try
    {
        udpClientR.Close();
        ...
4

3 に答える 3

2

Connect メソッドの呼び出しの設定から ip とポートを設定しています。別の IP とポートを使用して接続を再度呼び出してみてください。

于 2011-09-27T19:07:11.427 に答える
2

スレッドが開始し、 and を呼び出す前に停止するまで、しばらく時間が必要StartUpdですStopUpdCloseUDP クライアントを終了したら、スレッドが終了するのを待つことができます。これにより、再接続を試みる前に確実に閉じられます。したがって、コードは次のようになります。

  private UdpClient udpClientR;
  private Thread t1;
  void StartUpd()
  {
     udpClientR = new UdpClient();
     udpClientR.Connect(Settings.rxIPAddress, PORT_RX_LOCAL);
     t1 = new Thread(() => UdpReceiveThread(PORT_RX_REMOTE)) { IsBackground = true };
     t1.Start();
     // Give it some time here to startup, incase you call StopUpd too soon
     Thread.Sleep(1000);
  }

  private void StopUpd()
  {
     udpClientR.Close();
     // Wait for the thread to exit.  Calling Close above should stop any
     // Read block you have in the UdpReceiveThread function.  Once the
     // thread dies, you can safely assume its closed and can call StartUpd again
     while (t1.IsAlive) { Thread.Sleep(10); }
  }

StartUdp他のランダムなメモ、関数名のスペルを間違えたように見えますが、おそらくそうあるべきですStopUdp

于 2011-09-27T21:04:04.510 に答える
1

Connect の呼び出しは、UdpClient が接続する既定のリモートSendアドレスを確立します。つまり、メソッドの呼び出しでこのアドレスを指定する必要はありません。このコードは、表示されているエラーの原因にはなりません。このエラーは、2 つのクライアントで同じポートをリッスンしようとした結果であり、ここで実際に問題となっているのは UdpReceiveThread であると思われます。

UdpClient のコンストラクターでバインドするローカル ポート/アドレスを指定できます。

于 2011-09-27T19:30:29.463 に答える