【发布时间】:2015-05-20 20:43:46
【问题描述】:
我使用原始套接字在 C 中使用 recvFrom() 发送和接收以太网数据包。我想以非阻塞模式阅读,所以我使用 MSG_DONTWAIT。但是无论是否接收到数据包,recvFrom() 总是返回 -1。我是 C 编程新手。 我能够接收我的有效负载,但我总是收到消息“接收资源暂时不可用”。
代码片段:
if ((sock = socket(AF_PACKET, SOCK_RAW, htons(0x8851))) < 0) {
perror("ERROR: Socket");
exit(1);
}
while(1) {
int flag=0;
n=recvfrom(sock, buffer, 2048, MSG_DONTWAIT, NULL, NULL);
if (n == -1) {
perror("ERROR: Recvfrom");
close(sock);
flag=1;
}
if (flag==0) {
// Read Packet
}
}
【问题讨论】:
-
为什么要循环创建新的套接字?
-
另外,它打印什么错误?
-
我在问题中添加了错误消息。我也每次都关闭它。
-
如果在没有套接字的情况下接收到数据包,您认为会发生什么? (答案:它会像任何数据包一样被正常处理,但您的程序不会收到副本,因为它没有原始套接字)
-
它总是返回 -1 和 EAGAIN 因为它从来没有收到数据包...
标签: c linux sockets raw-sockets