gpt4 book ai didi

c - 为什么 C 中的 IPPROTO_DIVERT 经过几次测试后就停止工作了?

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

我正在开发一个应用程序(从 here 获取代码)来使用 C 显示 OS X 中网络数据包的内容,这是我的代码:

/* open a divert socket */
fd=socket(AF_INET, SOCK_RAW, IPPROTO_DIVERT);

if (fd==-1) {
fprintf(stderr,"We could not open a divert socket\n");
exit(1);
}

bindPort.sin_family=AF_INET;
bindPort.sin_port=htons(5060);
bindPort.sin_addr.s_addr=0;

fprintf(stderr,"Binding a socket\n");
ret=bind(fd, (struct sockaddr *)&bindPort, sizeof(struct sockaddr_in));

if (ret!=0) {
close(fd);
fprintf(stderr, "Error bind(): %s",strerror(ret));
exit(2);
}
/* read data in */
sinlen=sizeof(struct sockaddr_in);
while (1) {
n = (int)recvfrom(fd, packet, 1514, 0, (struct sockaddr*)&sin, (socklen_t*)&sinlen);
hdr = (struct ip *) packet;
fprintf(stdout, "\n{{packet size: [%d]}}\n", htons(hdr->ip_len));fflush(stdout);
printf("The packet looks like this:\n");
for (i = 0; i < 40; i++) {
printf("%02x ", (int)*(packet + i));
if (!((i + 1) % 16))
printf("\n");
};
printf("\n");

printf("Source address: %s\n", inet_ntoa(hdr->ip_src));
printf("Destination address: %s\n", inet_ntoa(hdr->ip_dst));
printf("Receiving IF address: %s\n", inet_ntoa(sin.sin_addr));
printf("Protocol number: %i\n", hdr->ip_p);
}

在运行代码之前,我运行以下命令:

ipfw add divert 5060 all from any to 192.168.1.34

该代码的问题在于它不可靠。它有时有效,有时无效。我必须重新启动机器然后它才能工作(但仅几次)。有没有其他方法将数据包从内核空间发送到用户空间?最终,我想更改数据包并将它们重新注入(inject)到网络流中。

最佳答案

我找到了解决问题的解决方案。

pfctl -d//这个命令可以让你毫无问题地使用ipfw。

PS:IPFW 在 Yosemite 中已被停用!

关于c - 为什么 C 中的 IPPROTO_DIVERT 经过几次测试后就停止工作了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25736043/

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