如何在 Linux 中创建原始套接字而不缓冲接收数据包?是不是可以?
Posted
技术标签:
【中文标题】如何在 Linux 中创建原始套接字而不缓冲接收数据包?是不是可以?【英文标题】:How create raw socket in Linux without buffering receive packets? Is it possible?如何在 Linux 中创建原始套接字而不缓冲接收数据包?是否可以? 【发布时间】:2016-07-14 06:51:06 【问题描述】:我使用 Linux,并且创建了一个使用原始套接字的应用程序。当我打开它并recv(...)
时,我得到了数据包,这些数据包更早,我猜是在内核或网卡驱动程序中缓冲的。但我不需要它们。我只需要数据包,它是在我打开套接字之后发送的。
当然,我可以丢弃这些数据包,但我不知道我需要丢弃多少数据包,因为每次数据包的数量都不一样。
如何创建这个套接字?有可能吗?
【问题讨论】:
【参考方案1】:取决于您如何协商主机/端口以进行通信,您是否可以控制发送这些数据包的内容?
你可以:
1) 在打开套接字后立即执行 recv() 循环(使用 flags=MSG_DONTWAIT)并忽略每个数据包,假设它是陈旧的,一旦 recv() 返回
2) 每次协商一个新的端口
3) 向您的数据包添加自定义标头(例如前 N 位)以指示例如序列号,或特殊的“新连接”代码,或时间戳。这种用法真的取决于你在这个原始套接字的两端做什么。
【讨论】:
谢谢。我无法控制传入的数据包,也无法自定义数据包的标头。第一次推荐很好。我怎样才能变得陈旧?它将是所有数据包,直到recv 不会返回EWOULDBLOCK?什么是谈判? (我是英语初学者,有时听不懂特殊术语)。我想可能有像 ioctl(...) 或 setsockopts(...) 之类的方法。 是 - 直到 recv(..., MSG_DONTWAIT) 返回 “协商”是指您可以让 2 个应用程序在每次发送真实数据之前决定要使用的端口 - 例如首先在已知端口上使用“请在端口 X 上与我交谈”发送数据包,然后在该端口上进行真正的通信。但是鉴于您的“我无法控制传入数据包,并且我无法自定义数据包标头”的附加信息,我不相信您能够做到这一点,因为它要求您控制两端交流。 谢谢。我将尝试使用 EWOULDBLOCK,我无法协商两个应用程序。我只有来自网络的数据包,很多数据包。以上是关于如何在 Linux 中创建原始套接字而不缓冲接收数据包?是不是可以?的主要内容,如果未能解决你的问题,请参考以下文章