gpt4 book ai didi

c - 如何更快速地读取TCP数据包?

转载 作者:行者123 更新时间:2023-11-30 21:43:14 25 4
gpt4 key购买 nike

这里我将 TCP 数据包发送到环回接口(interface)。同时,我尝试使用 pcap 库从该接口(interface)捕获这些数据包。但这种捕获需要一些时间并导致整个过程变慢。所以我需要找到快速读取TCP数据包的方法。(代码是c语言的)

while (1) {
u_int max_len = 1514 - sizeof (packet_hdr);
if (max_len < (tot_len - data_send))len = max_len;
else len = tot_len - data_send;

packet = finalize(packet_hdr, arr, len, tmp_len, src_port, src_ip, dst_port, dsts_ip, eth_src, eth_dst); //initialize TCP header fields.

u_char *buff_cpy = (u_char*) malloc(sizeof (packet));
memcpy(buff_cpy, (const u_char*) &packet, sizeof (packet));

int send = pcap_sendpacket(conn_handler, buff_cpy, sizeof (packet_hdr) + packet.len); //send TCP packets into loopback interface.

free(buff_cpy);
packet1 = pcap_next(conn_handler, &packet_header); //capture sent packets into loopback interface
printf("capture: %d\n", packet_header.caplen);

if (send == -1) printf("PACKET NOT SEND");
data_send += packet.len;
if (data_send == tot_len) break;
}

这是我的代码的一部分,使用 pcap_next() 来捕获数据包。但是花了一些时间。所以我需要加快速度。

最佳答案

尝试 RAW 套接字和 recvfrom()。应该是相当快的。示例:

int fd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if (fd != -1)
{
char buf[2345];
struct sockaddr_in addr;

for (int i = 0; i < 10; i++)
{
socklen_t addrlen = sizeof(addr);
int len = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&addr, &addrlen);
printf("len = %d\n", len);
}
close(fd);
}

示例代码接收所有带有 IP header 的传入 TCP 数据包。如果需要,您可以将其绑定(bind)到环回接口(interface)。您必须自行实现其他过滤。

对于绑定(bind)到环回接口(interface):

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "lo", sizeof(ifr.ifr_name));
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));

关于c - 如何更快速地读取TCP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53183987/

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