0

在我的应用程序中,我使用原始套接字在数据链路层接收数据包(type PF_PACKET, SOCK_RAW)。我发现我只能得到任何数据包的前 96 个字节。我假设某处有一些选项阻止我接收整个数据包,但是什么?这是我的代码片段:

int sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
int nBytesRead = read(sock, (char *) buf, 1500);
int nFlags = fcntl(m_sock, F_GETFL, 0);     // make it non-blocking
fcntl(sock, F_SETFL, nFlags | O_NONBLOCK);

nBytesRead 永远不会超过 96,即使我的网络嗅探器显示更长的数据包。如果这有所作为,这就是 uClinux。我在http://www.network-builders.com/raw-socket-captures-only-first-96-bytes-packet-t57283.html找到了其他人有同样的问题,但那里没有答案。

4

1 回答 1

0

解决了!我在原来的帖子中没有提到的是我在原始套接字上附加了一个过滤器,因此它只会接收某些 TCP/IP 端口上的流量。此过滤器代码是使用 TCPDUMP 创建的,它默认将捕获限制为 96 个字节。我必须将-s0选项添加到我的 TCPDUMP 命令行中,以告诉它捕获所有内容: tcpdump -dd -s0 "ip and tcp and dst port 60001".

有了这个改变,它现在给了我完整的数据包。感谢这篇博文提供线索。希望这对将来的其他人有所帮助。

于 2013-07-31T00:07:16.407 回答