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

Mai*_*ake 0 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;
 }
Run Code Online (Sandbox Code Playgroud)

编译并执行此程序之后。在另一个终端上执行

nc -u localhost 90
Run Code Online (Sandbox Code Playgroud)

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

pro*_*-fh 5

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

您有两种选择:

  1. 选择1024以上的端口
  2. 以特权运行程序(sudo ...)

人们应该考虑测试bind()(通常是任何其他系统调用)的结果,以轻松检测到这种情况。