返回> 网站首页
[转载]多网卡指定网卡发送数据
yoours2015-06-10 12:57:18
简介一边听听音乐,一边写写文章。
环境: 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 <WINSOCK2.H> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") #include<process.h> 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这块网卡发送出去。 |
文章评论
1899人参与,0条评论