gpt4 book ai didi

c - 如何编写重发数据包的代理程序?

转载 作者:可可西里 更新时间:2023-11-01 02:54:22 26 4
gpt4 key购买 nike

我需要在两台主机之间的代理服务器上使用 C 语言使用原始套接字编写程序。
我已经为它编写了一些代码(并为 iptable 设置了一些规则以将数据包的目标地址更改为代理的接口(interface)),我在其中接收数据包,打印此数据包中的数据,然后将数据包发送给接收方。

它在我的原始套接字上的简单客户端/服务器程序上工作,但是当我尝试通过代理建立连接时 - 它不起作用。

对于如何在不使用内核的情况下编写此程序,您有什么想法吗?

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

#define PCKT_LEN 8192

int main(void){
int s;
char buffer[PCKT_LEN];
struct sockaddr saddr;
struct sockaddr_in daddr;
memset(buffer, 0, PCKT_LEN);

s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
if(s < 0){
printf("socket() error");
return -1;
}

int saddr_size = sizeof(saddr);
int header_size = sizeof(struct iphdr) + sizeof(struct tcphdr);
unsigned int count;

daddr.sin_family = AF_INET;
daddr.sin_port = htons(1234);
daddr.sin_addr.s_addr = inet_addr ("2.2.2.1");

while(1){
if(recvfrom(s, buffer, PCKT_LEN , 0, &saddr, &saddr_size) < 0){
printf("recvfrom() error");
return -1;
}
else{
int i = header_size;
for(; i < PCKT_LEN; i++)
printf("%c", buffer[i]);

if (sendto (s, buffer, PCKT_LEN, 0, &daddr, &saddr_size) < 0)
printf("sendto() error");
return -1;
}
}
}
close(s);
return 0;
}

最佳答案

(你的代码有严重的错误。例如,sendto(2) 的最后一个参数不应该是一个指针。我假设它不是真正的代码,并且真正的代码编译时没有警告。)

随着唠叨,我认为一个问题是您不小心在发送的数据包中包含了一个额外的 IP header 。 raw(7) 具有以下内容:

The IPv4 layer generates an IP header when sending a packet unless the IP_HDRINCL socket option is enabled on the socket. When it is enabled, the packet must contain an IP header. For receiving the IP header is always included in the packet.

IP_HDRINCL 默认情况下不启用,除非 protocolIPPROTO_RAW(请参阅 raw(7)),这意味着它在您的情况下被禁用。 (我还检查了 getsockopt(2)。)

您将不得不使用 setsockopt(2) 启用 IP_HDRINCL 以告诉内核您正在自己提供 header ,或者不在 发送到()

不如看看IHL IP header 中的字段比假设它具有固定大小。 IP header 可以包含选项。

还可能存在其他问题,具体取决于您尝试执行的操作,详细信息可能因 IPv6 而异。

关于c - 如何编写重发数据包的代理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29198122/

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