为什么UDP套接字无法从nc -u主机端口接收udp流量?

时间:2019-07-24 13:12:59

标签: c sockets udp netcat

 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

测试使用自INADDR_ANY以来我是否真的从“任何接口”接收到一些udp流量。但是程序只是挂起。我想念什么?

2 个答案:

答案 0 :(得分:4)

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

您有两个选择:

  1. 选择高于1024的端口
  2. 使用特权(sudo ...)运行程序

人们应该考虑测试bind()的结果(就像其他任何系统调用一样),以轻松发现这种情况。

答案 1 :(得分:0)

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

nc -u localhost 1025

程序正在挂起。...显然是因为除了'\n'之外,我什么都没传递,套接字没有收到。

nc -u -v localhost 1025

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

在这两种情况下写一堆字符都是可行的。