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

标签 c macos sockets ipfw

我正在开发一个应用程序(从 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/

相关文章:

c - C 套接字服务器中的accept() 速度慢

c - 分配给类型 'struct compartido' 时不兼容的类型

C - 如何输入字符串并将其插入到字符串数组中?

c - 启用宏的语言如何跟踪源代码以进行调试?

java - 简单的休息服务与 Tomcat 和 Eclipse,Mac 操作系统。请求的资源不可用

c - C中通过套接字发送文件

C 通过 udp 套接字发送结构

Angular2 - 找不到 NgModule

sql - 我下载了 mac os 的 mssql 工具,但它说 "sqlcmd: command not found"

c++ - 套接字关闭时管道破裂