您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 1浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

多网卡指定网卡发送数据

phymat.nico 发布时间:2020-07-20 18:39:27 ,浏览量:1

环境:

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

 

代码如下:

 

 

 
  1. #include "stdafx.h"

  2. #include

  3. #include

  4. #pragma comment(lib,"ws2_32.lib")

  5.  
  6.  
  7. #include

  8.  
  9. void udpTest();

  10. int _tmain(int argc, _TCHAR* argv[])

  11. {

  12.  
  13. udpTest();

  14.  
  15.  
  16.  
  17.  
  18. return 1;

  19. }

  20.  
  21.  
  22. void udpTest()

  23. {

  24. WORD wVersionRequested;

  25. WSADATA wsaData;

  26. int err;

  27.  
  28. wVersionRequested = MAKEWORD( 1, 1 );

  29.  
  30. err = WSAStartup( wVersionRequested, &wsaData );

  31. if ( err != 0 ) {

  32. return;

  33. }

  34.  
  35. if ( LOBYTE( wsaData.wVersion ) != 1 ||

  36. HIBYTE( wsaData.wVersion ) != 1 ) {

  37. WSACleanup( );

  38. return;

  39. }

  40. SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

  41.  
  42.  
  43. SOCKADDR_IN addrSelf;//本地地址

  44. addrSelf.sin_addr.S_un.S_addr = inet_addr("10.9.16.88");//指定网卡的地址

  45. addrSelf.sin_family = AF_INET;

  46. addrSelf.sin_port = htons(17557);

  47. if( -1 == bind(sockClient,(SOCKADDR*)&addrSelf,sizeof(SOCKADDR)))//把网卡地址强行绑定到Socket

  48. printf("bind error!\r\n");

  49.  
  50.  
  51. SOCKET SendToSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  52. printf("bind:%d\r\n" ,bind( SendToSocket , (SOCKADDR*)&addrSelf , sizeof(SOCKADDR)));

  53. SOCKADDR_IN addrSrv;

  54. addrSrv.sin_addr.S_un.S_addr=inet_addr("10.9.24.1");//发往10.9.24.1 ;

  55. addrSrv.sin_family=AF_INET;

  56. addrSrv.sin_port=htons(17557);

  57.  
  58. while(1)

  59. {

  60. char* pchSend = "abcdefghijklmn";

  61. int i = sendto( SendToSocket , pchSend , strlen(pchSend) , 0 , (sockaddr*)&addrSrv,sizeof(sockaddr));

  62. printf( "sendto:%d\r\n" , i );

  63. printf(".........\r\n");

  64. Sleep(3000);

  65. }

  66.  
  67.  
  68.  
  69. closesocket(sockClient);

  70. WSACleanup();

  71. }

 

 

请注意这段代码:

 

 
  1. SOCKADDR_IN addrSelf;//本地地址

  2. addrSelf.sin_addr.S_un.S_addr = inet_addr("10.9.16.88");//指定网卡的地址

  3. addrSelf.sin_family = AF_INET;

  4. addrSelf.sin_port = htons(17557);

  5. if( -1 == bind(sockClient,(SOCKADDR*)&addrSelf,sizeof(SOCKADDR)))//把网卡地址强行绑定到Socket

  6. printf("bind error!\r\n");

一般来说 UDP 是不需要一个地址绑定到socket的,只有TCP需要绑定一个端口和ip。

那么,如果我们在这里,不运行 bind() 这个函数,系统会根据自身路由,把发往10.9.24.1 的报文 通过 10.9.24.88这块网卡发送出去。

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0457s