用C语言socket RAW功能实现同一台主机两个网口间数据收发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言socket RAW功能实现同一台主机两个网口间数据收发相关的知识,希望对你有一定的参考价值。

1,本例子使用一台PC,有两个网口,OS为CENTOS 6.8,然后使用两条网线分别都连接到同一个交换机上,当数据经过交换机时,交换机的数据灯会闪烁,否则就没有数据通过交换机。


2,开始测试,刚开始理所当然的想到的是TCP Server/TCP Client模式,建立socket

    int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
    struct sockaddr_in server_sockaddr;
    server_sockaddr.sin_family = AF_INET;
    server_sockaddr.sin_port = htons(MYPORT);
    server_sockaddr.sin_addr.s_addr = inet_addr(IP_PORT_0);

    if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
    {
        perror("bind");
        exit(1);
    }

    if(listen(server_sockfd,QUEUE) == -1)
    {
        perror("listen");
        exit(1);
    }


    char buffer[BUFFER_SIZE];
    struct sockaddr_in client_addr;
    socklen_t length = sizeof(client_addr);

    int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
    if(conn<0)
    {
        perror("connect");
        exit(1);
    }

    while(1)
    {
        memset(buffer,0,sizeof(buffer));
        int len = recv(conn, buffer, sizeof(buffer),0);
        send(conn, buffer, len, 0);
    }
    close(conn);
    close(server_sockfd);
    return 0;
}


TCP Client端同样写相应代码,编译通过,先后执行server/client程序,显示都有数据收发成功,但交换机的数据灯没有任何显示,于是明白了,系统默认直接从本地发送接收数据,并没有从网卡端口实际发送出去,因为TCP是基于IP协议之上,而IP协议是肯定走本地内部路由,因此使用TCP,UDP等IP之上的协议肯定不会成功。

int init_sock (char index[IFNAMSIZ])
{
  int fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));  
  struct sockaddr_ll sll;                 
     struct ifreq ifr;                   
     strncpy(ifr.ifr_name, index , IFNAMSIZ);    
     ioctl(fd, SIOCGIFINDEX, &ifr);  
     bzero(&sll, sizeof(sll));  
     sll.sll_ifindex = ifr.ifr_ifindex;
     ioctl(fd, SIOCGIFHWADDR, &ifr);
     memcpy(sll.sll_addr,ifr.ifr_hwaddr.sa_data,6);
  sll.sll_family = AF_PACKET;
  sll.sll_protocol = htons(ETH_P_ALL);
  bind(fd,(struct sockaddr *)&sll,sizeof(sll));
  return fd;
}


使用如上RAW Socket初始化后,再发送接收,一切OK!!!,能够接收到除了CRC之外的完整链路层帧,包括MAC地址,帧类型字段等,程序发送接收时,交换机的数据灯不停闪烁。



本文出自 “积小流成江河” 博客,请务必保留此出处http://laoxiong.blog.51cto.com/5735045/1880968

以上是关于用C语言socket RAW功能实现同一台主机两个网口间数据收发的主要内容,如果未能解决你的问题,请参考以下文章

UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信

同一台主机部署两个比特币钱包以及rpc服务的摘要

socket编程

用 C 语言实现内核,用 C# 实现 Shell

linux系统ubuntu:用Qtcreater编程,需要实现两个主机之间的通讯,比如传输数据,应该怎样实现?

socket发送UDP广播实现聊天室功能