如何更改UdpClient IP地址?

时间:2011-09-27 18:53:39

标签: c# udpclient

有没有办法动态更改UdpClient IP地址? StartUpd()抛出

  

System.Net.Sockets.SocketException:每个套接字只有一种用法   通常允许地址(协议/网络地址/端口)

即使做了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();
        ...

3 个答案:

答案 0 :(得分:2)

您正在调用Connect方法中的设置中设置ip和port。尝试使用不同的IP和端口再次呼叫连接。

答案 1 :(得分:2)

您需要一些时间来开始线程,并在您可以致电StartUpdStopUpd之前停止。一旦Close UDP客户端,您就可以等待线程退出。这将确保在您尝试重新连接之前关闭它。所以代码会像这样:

  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); }
  }

其他随机说明,看起来你拼错了函数名,可能应该是StartUdpStopUdp

答案 2 :(得分:1)

对Connect的调用会建立UdpClient连接的默认远程地址,这意味着您无需在调用Send方法时指定此地址。此代码应该不会导致您看到的错误。此错误是尝试使用两个客户端侦听同一端口的结果,这使我相信可能是您的UdpReceiveThread实际上是此处的问题。

您可以在UdpClient的构造函数中指定要绑定的本地端口/地址。