多网卡指定网卡发送数据

news/2024/5/17 19:25:22 标签: socket, stream, tcp, 网络

环境:

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这块网卡发送出去。




http://www.niftyadmin.cn/n/1371239.html

相关文章

bitset补码

int main() { ll n;cin>>n;bitset<32>bt(n);//数值 &#xff0c;32是位数 cout<<bt; }

windump 的一次实践

windump -d 可以列出当前的设备列表。我在windows7 下有时候会出现只能列出一个的问题&#xff0c;这时候需要把不可见的设备Disable后再次Enable 然后再次 windump -d 就可以看到了。windump -i x x是第几个设备&#xff0c;注意是 1Base &#xff0c; 不是0Basewindum…

删除前导0后导0

前导0 //ll co0;统计删了几个0 string hou(string a) { for(ll ia.size()-1;i>0;i--){ if(a[i]!0)break;a.erase(i,1);//co;}if(a.empty()1){a.push_back(0);}return a; } 后导0 string qian(string a) { ll na.size(); for(ll i0;i<n;i){ if(a[i]!0)break;a.erase(i…

GCD函数

最大公约数 #include<bits/stdc.h> using namespace std; int main() { int a,b,c;cin>>a>>b;//5 15cstd::__gcd(a,b);cout<<c;//5 }

时间与纪年

判断闰年 int month1[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int month2[13]{0,31,29,31,30,31,30,31,31,30,31,30,31}; bool run(int a) { if((a%40&&a%100!0)||(a%4000))return 1;else return 0; } 星期循环 co%8;if(co0)co;

Windows7 64bit 使用局域网上的共享打印

我的机器是 Windows7 64Bit &#xff0c; 希望可以打印局域网上 10.9.16.90 这台计算机上的打印机&#xff0c; 打印机名称为 printer 之前使用 “Add A printer " ----> ”网络上的打印机“ 到最后总是失败&#xff0c; 提示&#xff1a; 无法连接打印机 错误 0x000…

C# System.Data.Sqlite.dll 的注意事项

最近在鼓捣Sqlite, 而且用在C#上面。 一般这个wrapper都是用 System.Data.Sqlite 来做的。 国外就喜欢折腾啊&#xff0c;悲剧啊&#xff0c;找了半天找到个&#xff1a; http://sqlite.phxsoftware.com/ 看也不看就下了个1.0.66.0 Apr 18, 2010 所谓最新版&#xff0c; …

string常用函数

翻转 reverse(&a[1],&a[4]);//左开右闭&#xff08;通用&#xff09; reverse(a.begin(),a.end()); string转int atoi(a.c_str()) 删除 a.erase(a.end()-1);//删去最后一个元素 a.erase(a.begin());//删去第一个元素 a.erase(1,3);//12345-->15 不可混用end和…