在Udp -Level上:“通常只允许使用每个套接字地址”

时间:2012-10-10 09:39:22

标签: c# udp udpclient socketexception

我的情景是:

在两台不同的机器上运行两个软件,一个作为服务器,一个作为客户端。它们都使用相同的端口在UDP级别上相互通信。 (由于客户端硬件,无法在TCP级别(有限的内存)上设置通信)。这种情况现在已经有15年了。

现在我想为这个客户端创建一个模拟器,这样我就不必使用客户端了(因为每次需要调试和解决问题时都需要重新配置)。而且它与我所处的位置不同。

我所做的是在虚拟网卡(使用de devcon实用程序创建)上创建了一个带有listenerport和senderport(与服务器相同)的简单客户端应用程序

现在当我运行客户端时,我得到一个SocketException:“通常只允许使用每个套接字地址(协议/网络地址/端口)”(这是我启动客户端时首先发生的事情)

这发生在我创建监听器的行:UdpClient listener = new UdpClient(listenPort);

在osi模型中,首先是网络层(ip addres),然后是端口号(带有TCP / UDP层)..

7   Application     Process Application     
6   Presentation
5   Session
4   Transport       Host to host          TCP, UDP  Packets
3   Network         Internet              IP, ICMP  Frames
2   Data Link       Network Access        ARP       Bits
1   Physical 

客户端没有监听与服务器相同的网卡(但它们都在同一台计算机上运行)。

我没有得到的是为什么这个消息?可能是因为创建虚拟网卡并在同一台计算机上使用相同的端口是不可能的? (因为我想在同一台计算机上运行客户端和服务器)

[编辑] Scenario of the setup

我只是想知道它可能是不可能的,因为它正在使用所有网卡的一个porst列表,因此它已经被使用了。 然后我的问题是:“如何制作第二个端口列表来监听(因为它是同一台计算机中不同的网卡?”

它与VirtualBox或VirtualPC几乎相同,是一个新的虚拟网卡。创建它们时,可以在同一端口上侦听(虽然它是一个虚拟机),但仍然是相同的硬件。然后提出他们是如何做到这一点的问题?

[/编辑]

3 个答案:

答案 0 :(得分:0)

  1. 您可以在虚拟机内运行/调试。
  2. 你可以买个便宜货(

至于添加第二个虚拟网络适配器,我从来没有见过在你的机器上伪造另一张卡的程序。

答案 1 :(得分:0)

在创建新的UdpClient()

时,指定0作为端口号
var clt = new UdpClient(0);

根据MSDN的文档,基础提供商分配一个没有冲突的免费端口号。

您的软件是测试机器人的模拟器。对我来说,没有必要为此目的遵循客户端硬件的规范。

答案 2 :(得分:0)

我已经解决了我的问题!我上面的想法理论起作用。

我发现我的前任已在当前计算机上的所有可用网卡上设置了UdpPortListener ....

 IPEndPoint(IPAddress.Any, receivePort);

我已将此设置为我想听的网卡,它可以正常工作!这里的结论是,永远不要假设有人如何实现代码(甚至是如何在纸面上说明),并且总是尝试对事物的实际处理方式进行“逆向工程”!

谢谢大家帮助我!