您好,登錄后才能下訂單哦!
1,本例子使用一臺PC,有兩個網(wǎng)口,OS為CENTOS 6.8,然后使用兩條網(wǎng)線分別都連接到同一個交換機(jī)上,當(dāng)數(shù)據(jù)經(jīng)過交換機(jī)時,交換機(jī)的數(shù)據(jù)燈會閃爍,否則就沒有數(shù)據(jù)通過交換機(jī)。
2,開始測試,剛開始理所當(dāng)然的想到的是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端同樣寫相應(yīng)代碼,編譯通過,先后執(zhí)行server/client程序,顯示都有數(shù)據(jù)收發(fā)成功,但交換機(jī)的數(shù)據(jù)燈沒有任何顯示,于是明白了,系統(tǒng)默認(rèn)直接從本地發(fā)送接收數(shù)據(jù),并沒有從網(wǎng)卡端口實(shí)際發(fā)送出去,因為TCP是基于IP協(xié)議之上,而IP協(xié)議是肯定走本地內(nèi)部路由,因此使用TCP,UDP等IP之上的協(xié)議肯定不會成功。
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初始化后,再發(fā)送接收,一切OK?。。?,能夠接收到除了CRC之外的完整鏈路層幀,包括MAC地址,幀類型字段等,程序發(fā)送接收時,交換機(jī)的數(shù)據(jù)燈不停閃爍。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。