c++ - 读取 TCP 标头并使用 RAW_SOCKET 管理 TCP 连接
问题描述
我正在尝试在 C++11 中获取 TCP 连接的 TCP 标头。阅读已经存在的 StackOverflow 问题(here、here、here和here),似乎我必须打开一个RAW_SOCKET
或编写一个 Linux 内核模块(LKM)才能访问它。
据我了解,打开原始套接字意味着处理整个 TCP 协议(握手、窗口大小等)。有没有办法获取 TCP 标头并让内核管理 TCP 协议(“手动”或使用某些框架)?
我知道我可以使用 libpcap 来捕获数据包,但这意味着我的应用程序会以某种方式从 TCP 套接字中的传入数据包和从 libpcap 捕获的数据包进行匹配。虽然这是一种可能的解决方案,但它会很麻烦(我不想这样做)。
任何帮助表示赞赏,谢谢!
解决方案
“快速而肮脏”的方法可能是使用两个连接,一个到远程主机的外部连接和一个纯内部连接。当然,这不会是最有效的方法,但很容易(并且快速)实施(QAD“解决方案”的核心特征......):
socket ext_raw ------- socket remote, TCP (likely, at least)
socket int_raw ---
| (loop back connection)
socket int_tcp ---
任何传入的消息ext_raw
都int_raw
只是从一个转发到另一个(而传入的消息ext_raw
可以检查 TCP 标头),而所有正常的 TCP 处理都是由内部 TCP 套接字完成的。所以在某种程度上,你将通过你的两个原始套接字隧道传输 TCP 连接......
推荐阅读
- python - 在 Dask 中处理多个 csv
- php - 在 MySQL 中对通过 UNION 连接的 SUM 进行求和,并在 PHP 中使用 ECHO 显示
- python - 无法构造反向牛顿多项式
- python - 缓存烧瓶登录 current_user.is_authenticated
- javascript - 在 PWA 中保持计时器运行的最佳实践
- tensorflow - 我当前在物理空间上保存的微调 BERT 模型需要 7GB 空间。模型占用这么大的空间是正常的吗?
- java - 是否可以用 20 位而不是 java 中的 8、16、32 位写入文件?
- python - Tensorflow LSTM 有状态选项不保持批次之间的状态
- java - 如何在 TextView 中显示 ArrayList 值?
- sql - 如何仅将日期时间的特定列转换为日期?