为什么 UDP 套接字不接收来自 nc -u 主机端口的 udp 流量?

Why UDP socket doesn't receive udp traffic from nc -u host port?

 int main(int argc, char *argv[])
 {
     struct sockaddr_in src = { .sin_family=AF_INET, .sin_addr.s_addr=INADDR_ANY, .sin_port=htons(90) };

     int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

     bind(fd, (struct sockaddr *)&src, sizeof(src));

     char buf[1024];
     ssize_t res = recvfrom(fd, buf, sizeof(buf), 0, NULL, 0);
     printf("res=%zi\n", res);

     return 0;
 }

编译并执行该程序后。在另一个终端我执行

nc -u localhost 90

测试我是否真的从 "any interface" 接收到一些 udp 流量,正如我使用 INADDR_ANY 所期望的那样。但是程序只是挂起。我错过了什么?

端口 90 小于 1024,因此进程需要特权才能将套接字绑定到它。

您有两个选择:

  1. 选择1024以上的端口
  2. 运行 您的程序具有权限 (sudo...)

应该考虑测试 bind() 的结果(与一般的任何其他系统调用一样)以轻松检测此类情况。

我没有通过 nc 提供足够的数据。 我面临两种情况:

nc -u localhost 1025

程序挂起....显然是因为除了套接字未收到的 '\n' 之外,我没有传递任何内容。

nc -u -v localhost 1025

我仍然只是传递 '\n' 但在这种情况下,套接字正在接收它。

写一堆字符在这两种情况下都有效。