为什么 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,因此进程需要特权才能将套接字绑定到它。
您有两个选择:
- 选择1024以上的端口
- 运行 您的程序具有权限 (sudo...)
应该考虑测试 bind()
的结果(与一般的任何其他系统调用一样)以轻松检测此类情况。
我没有通过 nc
提供足够的数据。
我面临两种情况:
nc -u localhost 1025
程序挂起....显然是因为除了套接字未收到的 '\n'
之外,我没有传递任何内容。
nc -u -v localhost 1025
我仍然只是传递 '\n'
但在这种情况下,套接字正在接收它。
写一堆字符在这两种情况下都有效。
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,因此进程需要特权才能将套接字绑定到它。
您有两个选择:
- 选择1024以上的端口
- 运行 您的程序具有权限 (sudo...)
应该考虑测试 bind()
的结果(与一般的任何其他系统调用一样)以轻松检测此类情况。
我没有通过 nc
提供足够的数据。
我面临两种情况:
nc -u localhost 1025
程序挂起....显然是因为除了套接字未收到的 '\n'
之外,我没有传递任何内容。
nc -u -v localhost 1025
我仍然只是传递 '\n'
但在这种情况下,套接字正在接收它。
写一堆字符在这两种情况下都有效。