C# 将两个UDP客户端连接到一个端口(发送和接收)
我试了一下他的建议,但收效甚微 请。。。任何帮助都将不胜感激 这是我的密码:C# 将两个UDP客户端连接到一个端口(发送和接收),c#,port,reusability,udpclient,C#,Port,Reusability,Udpclient,我试了一下他的建议,但收效甚微 请。。。任何帮助都将不胜感激 这是我的密码: static void Main(string[] args) { IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000); UdpClient udpServer = new UdpClient(localpt); udpServer.Client.SetSocketOption( SocketOptionLeve
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
}
static void Main(字符串[]args)
{
IPEndPoint localpt=新IPEndPoint(IPAddress.Any,6000);
UdpClient udpServer=新的UdpClient(localpt);
udpServer.Client.SetSocketOption(
SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
UdpClient udpServer2=新的UdpClient();
udpServer2.Client.SetSocketOption(
SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
udpServer2.Client.Bind(localpt);//我查找了您的错误消息,这解释了错误是什么以及发生错误的原因
以下是准确的错误消息和原因WSAEACCES10013()
拒绝许可
试图以其所禁止的方式访问插座
访问权限。例如,使用发送到的广播地址
未使用setsockopt(SO_广播)设置广播权限
WSAEACCES错误的另一个可能原因是当绑定
函数被调用(在带有SP4和更高版本的Windows NT 4.0上),另一个
应用程序、服务或内核模式驱动程序绑定到同一个
具有独占访问权限的地址。这种独占访问是一项新功能
使用SP4和更高版本的Windows NT 4.0,并使用
SO_独家提供德鲁塞选项
即使更改代码以便传入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
IPAddress-IPAddress=Dns.Resolve(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint=新IPEndPoint(ipAddress,11000);
//IPEndPoint localpt=新IPEndPoint(ipLocalEndPoint);
UdpClient udpServer=新的UdpClient(ipLocalEndPoint);
udpServer.Client.SetSocketOption(
SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
连接(ipLocalEndPoint);
UdpClient udpServer2=新的UdpClient();
udpServer2.Client.SetSocketOption(
SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);
udpServer2.Client.Bind(ipLocalEndPoint);//绑定之前必须设置套接字选项
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();
}
要解决UDP应用程序中的WSAEACCESS 10013()异常,可以尝试
udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
您收到了什么异常?@M.Babcock我收到的异常消息是:“试图以其访问权限所禁止的方式访问套接字”您的udpServer
实例在尝试绑定时是否会引发相同的异常?您似乎没有遵循问题中链接中显示的相同代码示例..我看到了IPAddress.Any,6000但是UdpClient udpServer2=new UdpClient(5000)呢?为什么不在try{}catch{}中包装类似的内容呢@M.Babcock如果我没有弄错的话,它在使用端点构造时已经绑定了。在任何情况下,我都尝试过这样做:udpServer.Client.Bind(localpt);在设置套接字选项之后,收到了另一条异常消息:“提供了无效参数”谢谢,但我已经找到了这些信息。我的代码使用了SocketOptionName.ReuseAddress,我认为它本质上是一个独占的eAddruse,但以.NET的方式。似乎需要其他方法来实现这一点,但我似乎找不到它。这将是一个很好的谜题。我想我也在正确的轨道上。我将帮助挖掘更多并尝试代码。它可能非常简单,即使是最有经验的程序员也会仔细检查它。谢谢,我已经看了好几天了…运气不好…这应该是一件非常简单的事情…请尝试运行此代码。当您调试此代码时,您的LocalPt将获得0.0.0:6000这将不起作用,因为0.0.0不起作用真的是一个ip,但无论如何,我会在下面发布我的发现,不确定其他人声称他们是如何让它工作的。这似乎不可能。必须要有一种方法来做到这一点。我的目标是创建一个包含UDP打孔的系统。这取决于我可以在发送数据的同一端口上侦听数据通过……我在这里发布了一个后续问题:为什么在localpt
上绑定Bind
和在inEndPoint
上接收,有什么不同吗?(如果我在localpt
上接收inEndPoint的接收将导致它持有数据包来自的远程套接字。您可以使用localpt,但这样您就无法轻松了解绑定到的本地套接字。
udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);