0

我打开了一个 UDP 套接字来监听传入的数据包。我可以在 wireshark 日志中看到到达 NIC 的数据包。但是通过 Socket 读取时不可用。'netsatat' 命令显示端口号被侦听任何传入的 UDP 消息。套接字阅读器继续等待。我已经在 Linux(ubuntu)环境中使用 Java 和 C 进行了检查。我可以看到收到的 IPV4 数据包的标识值是 0。这个值对套接字读取数据有什么作用吗?我用于读取套接字的 C 代码

int sock, n, nr;
socklen_t fromlen;
struct sockaddr_in server;
struct sockaddr_in from; 
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
 printf("Can not create socket in server\n");
memset(&server, 0, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(5555);
server.sin_addr.s_addr = INADDR_ANY;
if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
fromlen = sizeof(struct sockaddr_in);
while(1) {       
    printf("Waiting to receive\n");
    n = recvfrom(sock, &nr, sizeof(nr), 0, (struct sockaddr *) &from, &fromlen);
    printf("I have received");
}

请找到wireshark跟踪http://imgur.com/Au9BeS1

4

1 回答 1

1

这是个问题:

if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
fromlen = sizeof(struct sockaddr_in);

这只会设置fromlenbind调用失败。而且由于fromlen没有正确初始化,它将包含一个看似随机的值,对recvfrom.

于 2013-03-15T07:08:25.577 回答