2012-02-02 77 views
7

我试图从this question的建议非常收效甚微。连接两个UDP客户到一个端口(发送和接收)

请...任何帮助将不胜感激!

这里是我的代码:

static void Main(string[] args) 
{ 

    IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000); 

    UdpClient udpServer = new UdpClient(localpt); 
    udpServer.Client.SetSocketOption(
     SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

    UdpClient udpServer2 = new UdpClient(); 
    udpServer2.Client.SetSocketOption(
     SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

    udpServer2.Client.Bind(localpt); // <<---------- Exception here 
} 
+1

你得到什么异常? – 2012-02-02 21:14:47

+0

@ M.Babcock 我得到的异常消息是: “尝试以访问权限禁止的方式访问套接字” – brooc 2012-02-02 21:24:43

+0

尝试绑定时,您的udpServer实例是否会抛出相同的异常? – 2012-02-02 21:33:48

回答

23

你必须结合之前套接字选项设置。

static void Main(string[] args) 
    { 
     IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000); 

     UdpClient udpServer = new UdpClient(); 
     udpServer.Client.SetSocketOption(
      SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     udpServer.Client.Bind(localpt); 

     UdpClient udpServer2 = new UdpClient(); 
     udpServer2.Client.SetSocketOption(
      SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

     udpServer2.Client.Bind(localpt); // <<---------- No Exception here 

     Console.WriteLine("Finished."); 
     Console.ReadLine(); 
    } 

还是更说明性的例子:

static void Main(string[] args) 
    { 
     IPEndPoint localpt = new IPEndPoint(IPAddress.Loopback, 6000); 

     ThreadPool.QueueUserWorkItem(delegate 
     { 
      UdpClient udpServer = new UdpClient(); 
      udpServer.ExclusiveAddressUse = false; 
      udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
      udpServer.Client.Bind(localpt); 

      IPEndPoint inEndPoint = new IPEndPoint(IPAddress.Any, 0); 
      Console.WriteLine("Listening on " + localpt + "."); 
      byte[] buffer = udpServer.Receive(ref inEndPoint); 
      Console.WriteLine("Receive from " + inEndPoint + " " + Encoding.ASCII.GetString(buffer) + "."); 
     }); 

     Thread.Sleep(1000); 

     UdpClient udpServer2 = new UdpClient(); 
     udpServer2.ExclusiveAddressUse = false; 
     udpServer2.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     udpServer2.Client.Bind(localpt); 

     udpServer2.Send(new byte[] { 0x41 }, 1, localpt); 

     Console.Read(); 
    } 
+0

非常感谢! 工作就像一个魅力! – brooc 2012-02-03 12:01:59

+0

我在这里发布了一个后续问题:http://stackoverflow.com/questions/9140450/udp-hole-punching-implemetation-in-c-sharp – brooc 2012-02-04 11:19:09

+0

为什么你绑定'localpt'和'Receive' on 'inEndPoint',是否有不同? (如果我在'localpt'上接收''似乎没有任何中断) – Benjol 2012-03-19 14:12:51

2

我抬头一看你的错误信息,这说明是什么错误,为什么它正在发生。

这里是确切的错误信息和原因WSAEACCES 10013(MSDN

权限被拒绝。

试图通过其 访问权限不允许的方式来访问一个插座。一个示例是使用广播地址sendto 未使用setsockopt(SO_BROADCAST)设置广播权限。

另一个可能的原因WSAEACCES错误是,当绑定 函数被调用(在Windows NT 4.0 SP4或更高版本),另一种 应用程序,服务或内核模式驱动程序绑定到独家同一 地址访问。这种独占访问是Windows NT 4.0 SP4和更高版本中的新功能 ,并通过使用 SO_EXCLUSIVEADDRUSE选项实现。

+0

谢谢,但我已经找到这个信息。我的代码使用SocketOptionName.ReuseAddress,我认为它基本上是SO_EXCLUSIVEADDRUSE,但采用.NET方式。似乎有需要有其他方式来做到这一点,但我似乎无法找到它 – brooc 2012-02-02 22:01:05

+0

我这将是一个很好的谜题..我想我也是在正确的轨道上..我会帮助挖更多,并尝试代码以及​​..它可能是如此简单,即使是最经验丰富的编码器会看起来它.. – MethodMan 2012-02-02 22:03:03

+0

谢谢,我一直在寻找这个好几天...没有运气......这应该是一个非常简单的事情...请尝试运行此代码。 – brooc 2012-02-02 22:06:29

0

甚至改变你的代码,这样我可以在我得到它看来,你不能绑定到同一个端口,只有一个端口可以在这里使用 相同的错误消息的IP地址传递是示例代码我用你的榜样和改变它从我的本地机器捕捉我的IP ..

 IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList[0]; 
     IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 11000); 

     //IPEndPoint localpt = new IPEndPoint(ipLocalEndPoint); 

     UdpClient udpServer = new UdpClient(ipLocalEndPoint); 
     udpServer.Client.SetSocketOption(
      SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     udpServer.Connect(ipLocalEndPoint); 
     UdpClient udpServer2 = new UdpClient(); 
     udpServer2.Client.SetSocketOption(
      SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

     udpServer2.Client.Bind(ipLocalEndPoint); // <<---------- Exception here 

这将产生对bind()方法除外..对不起。

+0

有必须要做到这一点。我的目标是创建一个包含UDP打孔的系统。这取决于我可以在同一个端口上收听我发送数据的事实... – brooc 2012-02-02 22:42:07

0

为了解决WSAEACCESS 10013(MSDN)在UDP的应用程序异常,你可以尝试

udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); 
相关问题