NIC中收到的数据包无法通过套接字读取

时间:2013-03-14 08:50:41

标签: c sockets udp

我打开了一个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

1 个答案:

答案 0 :(得分:1)

这是一个问题:

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

这只会设置fromlen bind来电失败。由于fromlen未正确初始化,因此它将包含一个看似随机的值,该值对recvfrom无效。