c++ - 如何在不缓冲接收数据包的情况下在 Linux 中创建原始套接字?是否可以?

标签 c++ linux sockets

我使用 Linux,并且创建了一个使用原始套接字的应用程序。当我打开它并 recv(...) 时,我得到了更早的数据包,我猜是在内核或网卡驱动程序中进行了缓冲。但我不需要它们。我只需要打开套接字后发送的数据包。

当然,我可以丢弃这些数据包,但我不知道我需要丢弃多少数据包,因为每次数据包的数量都不同。

如何创建这个套接字?可能吗?

最佳答案

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

你可以:

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

2) 每次协商一个新的端口

3) 向您的数据包添加自定义 header (例如前 N 位)以指示例如序列号,或特殊的“新连接”代码,或时间戳。这种用法实际上取决于您在此原始套接字两端所做的事情。

关于c++ - 如何在不缓冲接收数据包的情况下在 Linux 中创建原始套接字?是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38367334/

相关文章:

python - 如何在python中使用SocketServer获取客户端的Name属性?

c++ - Qt交互渲染点、线、线段

c++ - 连接套接字的限制 boost::asio

c++ - 为什么 std::hash<int> 似乎是恒等函数

c - (内核简单编程)我想知道为什么pid会这样显示

linux - 在Ubuntu中使用Mono运行电子表格应用

javascript - Jetty Web 套接字超时

python - 在 Python 中通过套接字发送文件

c++ - 未处理的异常 : Access violation reading location 0x015E2348

操作大型数据类的多个 "worker classes"的 C++ 模式