91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用C語言socket RAW功能實現同一臺主機兩個網口間數據收發

發布時間:2020-07-30 20:02:20 來源:網絡 閱讀:2109 作者:plan1230 欄目:編程語言

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地址,幀類型字段等,程序發送接收時,交換機的數據燈不停閃爍。



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涡阳县| 湘乡市| 陕西省| 南溪县| 安陆市| 永靖县| 齐河县| 南岸区| 渭南市| 古交市| 隆昌县| 前郭尔| 东丽区| 密山市| 交城县| 繁峙县| 桐庐县| 吉林省| 无极县| 大姚县| 天等县| 长兴县| 临泽县| 卓尼县| 祁阳县| 馆陶县| 黄梅县| 永昌县| 汤阴县| 祥云县| 长阳| 荣成市| 会宁县| 乐陵市| 田林县| 平遥县| 泰和县| 金阳县| 合阳县| 巴塘县| 蒲江县|