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流量。但是程序只是挂起。我想念什么?
答案 0 :(得分:4)
端口90小于1024,因此进程需要特权才能将套接字绑定到该端口。
您有两个选择:
人们应该考虑测试bind()
的结果(就像其他任何系统调用一样),以轻松发现这种情况。
答案 1 :(得分:0)
我没有通过nc
提供足够的数据。
我面临两种情况:
nc -u localhost 1025
程序正在挂起。...显然是因为除了'\n'
之外,我什么都没传递,套接字没有收到。
nc -u -v localhost 1025
我仍然只传递'\n'
,但在这种情况下套接字正在接收它。
在这两种情况下写一堆字符都是可行的。