sockets - 作为 UDP 客户端的 Netcat 不接收来自 Arduino Wifi Shield 的响应数据包。简单的 C UDP 客户端。为什么?

标签 sockets networking udp arduino client-server

我正在测试 WiFi UDP Send and Receive String使用 Arduino Wifi Shield(2013 年 3 月最新固件更新)的示例 Arduino 代码,我遇到了无法解释的行为。

预期操作

Arduino 在其本地任意端口上从路由器上的另一台计算机接收 UDP 数据包 - remoteIP:remotePort。它通过将自己的 UDP 数据包发送回 remoteIP:remotePort 来向客户端确认它已收到数据包。

我想我会使用 netcat 进行测试。 netcat 将发送 UDP 数据包,Arduino 接收,但 netcat 没有接收到 Arduino 发送的数据包。怪在netcat,因为我用了一个Simple C UDP Client并且该客户端将收到 Arduino 服务器 UDP 响应。

有谁知道 Netcat 中有什么多余的东西会导致这种情况?在 TCP 上使用 netcat 与使用未知协议(protocol)的服务器进行交互时,我注意到了类似的问题。交互不是“原始的”,似乎应该显示的东西没有显示出来,比如来自 UDP 服务器的这些 UDP 数据包。是不是UDP报文的构成不满足netcat?

Arduino UDP Server Code

Simple C UDP Client Code

最佳答案

您的代码与 nc 之间的主要区别在于,您使用未连接的套接字并在 sendto 调用中指定接收者,而 nc 将使用连接的套接字。这意味着,您的套接字将接受来自任何地址的回复,而 nc 将只接受来自将请求发送到的相同 IP 和端口 的回复。我不知道你使用的 Arduino udp 库,但从简短的代码来看,我没有看到任何类似使用 udp 连接的东西,所以我认为我的理论是正确的。如果您使用 tcpdump/wireshark,这就是我希望您在 IP cip 和端口 cport 上与您的客户端以及 IP cip 和端口 32000 上的 Arduino 看到的(匹配您的示例 C 代码):

--> request from cip:cport to   aip:32000
<-- reply to     cip:cport from aip:random_port

但是如果你想让它与 nc 一起工作,你需要的是

--> request from cip:cport to   aip:32000
<-- reply to     cip:cport from aip:32000

关于sockets - 作为 UDP 客户端的 Netcat 不接收来自 Arduino Wifi Shield 的响应数据包。简单的 C UDP 客户端。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746501/

相关文章:

c# - 截取的屏幕截图仅包含黑色像素

c - 绑定(bind)套接字时如何不破坏 UDP 端口?

python - UDP 消息太长

android - 我应该使用哪个端口进行 TCP 数据包传输

c++ - 多线程多套接字同时发送/接收

C# 句柄强制关闭套接字连接

c - 在c中通过套接字发送缓冲区长度和缓冲区

通过流(通过 IP 地址)的 iOS 到 iOS 设备连接

java - Spring集成UDP服务器不监听

c - C中的UDP客户端