现在,我意识到,在不知道主机是否存在或响应(即它发送了ICMP回声回复)的主机上执行“发现”没有多大意义,但对于这个问题来说,这是至关重要的。我们还假设这里所讨论的主机实际上是可访问的,并且确实响应ICMP ping,例如通过命令行ping
。
“发现”最终导致一些ICMP“目的地不可达:端口不可达”数据包被发回管理服务器,例如,当目标主机上没有运行SNMP代理并且端口161实际上不可达时。
这是完全可以的,但出于某种原因,这似乎阻碍了ICMP套接字向该主机发送ICMP回送请求,这是ICMP ping所需的。由于该请求从未被发送,我的应用程序不会得到任何答复,主机将在一段时间后被视为“无法访问”(超时)。
事实上,负责发送请求的sendto
函数已经执行(通过调试确保了这一点),甚至返回成功(发送的字节数),但实际上并没有发送数据包。我可以在Windows和Linux系统上复制这个,所以我不认为这是任何类型的操作系统问题。
禁用“发现”会导致那些无法到达目的地的消息被发回,这使得一切都恢复正常,所以我相当肯定是那些消息阻碍了ICMP回送请求的发送。我找不到答案的一个大问题是:为什么会这样?
如果需要,我可以提供更多的信息,但是,恐怕我不允许在这里发布任何代码,因为这是一个商业产品。不过,代码并不特别,只是使用原始ICMP套接字发送和接收TOS=0
和TTL=64
的ICMP(IPv4)数据包。
Dest unreachable是由路由器生成的,或者如果您在localnet内ping,它将由LocalHost生成。
我想你的观察是因为你在本地网络中ping。正在生成ICMP-3的事实意味着ARP查找失败,如果没有ARP查找,您实际上无法发送数据包,因为您不知道目标MAC地址。解释了一切。
因此,无论如何,您应该像等待一秒钟一样等待一个固定的时间,并声明主机不在那里,是否发送数据包并不重要。
根据Stevens(图示为TCP/IP),traceroute程序用增量TTL(1、2、3等)向目的主机发送UDP数据包,以从ICMP TTL过期消息中获取中间跳信息。 “到达目的地”条件是ICMP端口无法到达的消息,因为traceroute寻址的随机端口数量很高(也就是说,不太可能有人在那里监听) 所以我的问题是:是否有技术原因(缺点、RFCs等)使用UDP数据包而不使用例如ICMP回送请求消息
已移动:https://superuser.com/questions/782549/udp-client-sending-icmp-port-unreachable-when-receiveing-messages-from-the-ser 我有一个使用luasocket的udp客户端,基本上是这样做的(有几个抽象层,但这是正在发生的事情): 虽然在服务器的调试输出(到远程主机的ssh)中看到一
我正在尝试使用WCF代码中的TCP套接字连接到远程外部服务器我的WCF服务是一个客户端,它的代码使用套接字连接到外部服务器。此代码向外部服务器发送请求并接收服务器响应 如果我使用相同的客户端代码创建一个windows应用程序以连接到远程服务器,则成功。我能够连接、发送和接收此错误仅在我将WCF带入图片时发生。代码在if(m_socket失败。连接)。因此无法成功连接。 非常感谢。
因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:
实现蓝牙发送和接收数据的demo。文件包含两个工程,一个接收,一个发送。 [Code4App.com]