2013-03-14 18 views
0

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

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

没有看到你所做的事情就无法说出任何话。请制作[SSCCE](http://sscce.org/)给我们看。 – 2013-03-14 08:53:08

+0

@JoachimPileborg添加了代码和链接以跟踪。请让我知道,如果你需要更多的细节 – 2013-03-15 03:50:56

回答

1

这是一个问题:

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

这将只设置fromlenbind电话失败。由于fromlen未正确初始化,因此它将包含一个看似无效的值,该值不适用于recvfrom

+0

绑定似乎工作正常。我能够接收带有Flag,Do not Fragment设置为0的IP数据包,但对于Don'Fragment = 1,数据包到达以太网但未到达应用程序。有没有什么好的方法来调试呢? IP中的数据包长度为820,我的eth0的MTU大小为1500 – 2013-03-20 04:27:05

+0

@vasanthmahadevan是的,'bind'调用可以工作,但是'fromLen'不会被设置。由于缩进,或者说缩进,可能很难看到。另外,如果'bind'失败(以及'socket'调用),那么你不应该继续发生任何事情。 – 2013-03-20 06:32:47

相关问题