环境:
2个网卡,分别在不同网络环境。
局域网一: 网关:10.9.16.254
电脑地址1:10.9.16.88
局域网二:网关:10.9.24.1
电脑地址2:10.9.24.88
要求: 通过 10.9.16.88 这个地址 发送一段数据到 10.9.24.1
代码如下:
-
#include "stdafx.h" -
#include -
#include -
#pragma comment(lib,"ws2_32.lib") -
#include -
void udpTest(); -
int _tmain(int argc, _TCHAR* argv[]) -
{ -
udpTest(); -
return 1; -
} -
void udpTest() -
{ -
WORD wVersionRequested; -
WSADATA wsaData; -
int err; -
wVersionRequested = MAKEWORD( 1, 1 ); -
err = WSAStartup( wVersionRequested, &wsaData ); -
if ( err != 0 ) { -
return; -
} -
if ( LOBYTE( wsaData.wVersion ) != 1 || -
HIBYTE( wsaData.wVersion ) != 1 ) { -
WSACleanup( ); -
return; -
} -
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) -
{ -
char* pchSend = "abcdefghijklmn"; -
int i = sendto( SendToSocket , pchSend , strlen(pchSend) , 0 , (sockaddr*)&addrSrv,sizeof(sockaddr)); -
printf( "sendto:%d\r\n" , i ); -
printf(".........\r\n"); -
Sleep(3000); -
} -
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这块网卡发送出去。
