環境:
2個網絡卡,分別在不同網路環境。
區域網一: 閘道器:10.9.16.254
區域網二:閘道器:10.9.24.1
電腦位址2:10.9.24.88
**如下:
#include "stdafx.h"
#include #include #pragma comment(lib,"ws2_32.lib")
#includevoid udptest();
int _tmain(int argc, _tchar* argv)
void udptest()
if ( lobyte( wsadata.wversion ) != 1 ||
hibyte( wsadata.wversion ) != 1 )
socket sockclient=socket(af_inet,sock_stream,0);
sockaddr_in addrself;//本地位址
addrself.sin_addr.s_un.s_addr = inet_addr("10.9.16.88");//指定網絡卡的位址
addrself.sin_family = af_inet;
addrself.sin_port = htons(17557);
if( -1 == bind(sockclient,(sockaddr*)&addrself,sizeof(sockaddr)))//把網絡卡位址強行繫結到socket
printf("bind error!\r\n");
socket sendtosocket = socket(af_inet, sock_dgram, ipproto_udp);
printf("bind:%d\r\n" ,bind( sendtosocket , (sockaddr*)&addrself , sizeof(sockaddr)));
sockaddr_in addrsrv;
addrsrv.sin_addr.s_un.s_addr=inet_addr("10.9.24.1");//發往10.9.24.1 ;
addrsrv.sin_family=af_inet;
addrsrv.sin_port=htons(17557);
while(1)
closesocket(sockclient);
wsacleanup();
}
請注意這段**:
sockaddr_in addrself;//本地位址
addrself.sin_addr.s_un.s_addr = inet_addr("10.9.16.88");//指定網絡卡的位址
addrself.sin_family = af_inet;
addrself.sin_port = htons(17557);
if( -1 == bind(sockclient,(sockaddr*)&addrself,sizeof(sockaddr)))//把網絡卡位址強行繫結到socket
printf("bind error!\r\n");
一般來說 udp 是不需要乙個位址繫結到socket的,只有tcp需要繫結乙個埠和ip。
那麼,如果我們在這裡,不執行 bind() 這個函式,系統會根據自身路由,把發往10.9.24.1 的報文 通過 10.9.24.88這塊網絡卡傳送出去。
多網絡卡指定網絡卡傳送資料
環境 2個網絡卡,分別在不同網路環境。區域網一 閘道器 10.9.16.254 區域網二 閘道器 10.9.24.1 電腦位址2 10.9.24.88 如下 include stdafx.h include include pragma comment lib,ws2 32.lib include ...
多網絡卡傳送資料報
方法一 使用libnet,這裡就不介紹了。方法二 使用原始套接字 指定網絡卡傳送資料的時候不需要指定網絡卡ip,只要設定struct ifreg ifr.ifr name就可以了。例如 struct ifreq ifr fd socket pf packet,sock raw,htons eth p...
指定網絡卡,socket傳送
我們在可程式設計路由器上的openwrt 基於linux 做資料 路由器有兩個資料出口,做冗餘傳送。可以該命令檢視本地路由器表 route n多層結構,即資料出口外還有路由器裝置提供上層的資料出口,資料目的位址不是當前網段 因此,需要將socket與網絡卡進行繫結傳送資料 使用libpcap的 pc...