Linux原始数据链路层套接字仅返回部分数据包(96字节)

时间:2013-07-30 22:38:52

标签: linux sockets

在我的应用程序中,我使用原始套接字(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找到了其他有同样问题的人但在那里没有答案。

1 个答案:

答案 0 :(得分:0)

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

有了这个改变,它现在给了我完整的数据包。感谢this blog post提供线索。 希望这有助于将来的其他人。