返回> 网站首页 

[转载]多网卡指定网卡发送数据

yoours2015-06-10 12:57:18 阅读 1809

简介一边听听音乐,一边写写文章。

环境: 
 
2个网卡,分别在不同网络环境。 
局域网一: 网关:10.9.16.254 
电脑地址110.9.16.88 
 
局域网二:网关:10.9.24.1 
电脑地址210.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(11); 
    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这块网卡发送出去。 
微信小程序扫码登陆

文章评论

1809人参与,0条评论