gpt4 book ai didi

c - 在 C 中立即(逐个数据包)从套接字接收 TCP 有效负载

转载 作者:可可西里 更新时间:2023-11-01 02:34:05 24 4
gpt4 key购买 nike

如何在 C 中逐个数据包地从开放网络套接字接收数据(字节流)?我想在数据到达时立即从套接字中读取数据(数据包一到达机器)。

似乎当我在套接字上执行 read()(或 recv())调用时,我得到了超过 10,000 字节的整个 TCP 消息。相反,我想接收第一个 TCP 段有效载荷,处理它,然后继续下一个,等等。

注意 - 我不想要原始数据包。只是 TCP 段数据负载。

另请注意 - 本质上,我想通过在数据到达时立即处理数据来最大程度地减少延迟,而不是等待整个 TCP 消息在 TCP 层中累积。

任何想法将不胜感激,谢谢!

最佳答案

也许我误解了你的问题(例如,我不能完全理解“不想要原始数据包只是 TCP 负载”),而是一个简单的原始套接字 (IPPROTO_TCP) 连接然后用 recv() 嗅探会做的工作。您在 recv() 中将最大缓冲区大小指定为参数,但是当 TCP 负载到来时,它将被报告回来——无需等待缓冲区填满。以下是一些打印出 TCP 数据包的代码摘录:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include // your header to print out bytes and error messages here

int main(void) {
int i, recv_length, sockfd;
u_char buffer[9000];

if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)) == -1)
// your error message here

for(i=0; i < 3; i++) {
recv_length = recv(sockfd, buffer, 8000, 0);
printf("Got a %d byte packet\n", recv_length);
// your routine to print out bytes here
}
}

如果这不是您关心的问题,请澄清。

编辑:据我所知,使用库 pcap (libcap) 优于使用原始套接字(更可靠;非常强大 - 由编写 tcpdump 的人编写)。但是,我自己仍在学习 pcap,到目前为止,我一直在努力让它与无线设备一起正常工作。但如果您持续需要它,也可以考虑一下。

关于c - 在 C 中立即(逐个数据包)从套接字接收 TCP 有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com