如何在Linux中创建原始套接字而不缓冲接收数据包?可能吗?

时间:2016-07-14 06:51:07

标签: c++ linux sockets

我使用Linux,并创建特定的应用程序。我使用原始套接字。而且,当我打开它并recv(...)时,我收到了数据包,这些数据包已被收集,而且,我猜测,它是在内核或网卡驱动程序中缓存的。但我不需要它们。我只需要数据包,我打开插座后就去了。 Ofcource,我可以丢弃这些数据包,但我不知道我需要丢弃多少数据包,因为每次数据包的数量都不同。 如何创建这个套接字?可能吗?

1 个答案:

答案 0 :(得分:3)

取决于您如何协商主机/端口进行通信,您是否可以控制发送这些数据包的任何内容?

你可以:

1)打开套接字后,立即执行一个recv()循环(带有flags = MSG_DONTWAIT)并忽略每个数据包,假设它是陈旧的,一旦recv()返回< = 0字节就结束循环(它应该将errno设置为EWOULDBLOCK以指示没有任何东西可以读取,否则原因可能是另一个与套接字相关的问题)

2)每次协商新端口

3)向数据包添加自定义标头(例如,前N位)以指示例如序列号,或特殊的"新连接"代码或时间戳。这种用法实际上取决于你在这个原始套接字的两端做了什么。