网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题:

在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从哪个网卡发数据包出去,即使你在此之前把该 SOCKET 绑定到了另一个网卡上。这样一来,如果你执行了绑定,则在 UDP 包中所代表的源 IP 字段可能不是你的数据包真正发出的地址。

比如:你有两个网卡分别为:A—192.168.1.100; B-192.168.2.100; mask-255.255.255.0

此时你如果将一 UDP 套接字 S 绑定到了 A 上,但是要发的目的地址为 192.168.2.110,这时包实际是从网卡 B 上发出去的(根据路由最优原则),但在包头的结构里面,由于 BIND 的缘故,可能指向的源地址为 A。这样源 IP 地址就产生了与实际不相符的错误。

要解决这种问题, 可以把套接字绑定到一个指定的网络设备, "eth0", "ppp0"等.

三个示例:

1. example(TCP, UDP, RAW):

int sock;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
memset(&ifr, 0x00, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZE);
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr));

2. example(PACKET):

int sock;
struct sockaddr_ll sl;
struct ifreq ifr;
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6));
memset(&sl, 0x00, sizeof(sl));
memset(&ifr, 0x00, sizeof(ifr));
sl.sll_family = AF_PACKET;
sl.sll_protocol = htons(ETH_P_IPV6);
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
ioctl(fd, SIOCGIFINDEX, &ifr);
sl.sll_ifindex = ifr.ifr_ifindex;
bind(fd, (struct sockaddr *)&sl, sizeof(sl));

3. example(PACKET):

int sock;
struct sockaddr addr;
sock = socket(PF_PACKET, SOCK_PACKET, ETH_P_IP);
memset(&addr, 0x00, sizeof(addr));
addr.sa_family = PF_PACKET;
strncpy(addr.sa_data, "eth0", sizeof(addr.sa_data));
bind(sock, &addr, sizeof(addr));

针对SO_BINDTODEVICE套接口选项,man(7)手册有如下说明:

SO_BINDTODEVICE

Bind  this  socket  to  a particular device like “eth0”, as specified in the passed interface name.  If the name is an empty string or the option length is zero, the socket device binding  is  removed.   The  passed option  is a variable-length null-terminated interface name string with the maximum size of IFNAMSIZ.  If a socket is bound to an interface, only packets received from that particular interface are processed by  the socket.  Note  that  this  only works for some socket types, particularly AF_INET sockets.  It is not supported for packet sockets (use normal bind(8) there).

双网卡服务器SOCKET编程指定客户端通信网卡相关推荐

  1. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)

    开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...

  2. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  3. socket编程TCP/IP通信(windows下,C++实现)

    1.简单理解什么是Socket? 通俗理解: Socket翻译成中文是套接字,同时也有插座的意思.可以按照插座的意思来理解它,插座就是连接电源和机器的中间件,同理,socket就是连接两个进程或应用的 ...

  4. Linux服务器 - Socket编程函数_accept函数

    Socket编程函数 accept函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int a ...

  5. Socket编程(Android客户端+PC服务器端)

    一个多月没有写东西了,感觉像过了一个暑假...废话不多说了,今天来记录一下这两天学习Socket的内容.按照我研究思路来进行一步步的深入Socket. 一.什么是Socket 网络上的两个程序通过一个 ...

  6. php socket read 阻塞,php socket编程:客户端异常关闭导致服务端中断的问题

    socket_recv和socket_read都可以用于读取socket数据,不过二者有差别,推荐使用socket_recv. 原因如下: 1.socket_recv支持多种flag,用于不同场景 2 ...

  7. python实现socket编程,客户端和服务端之间互相对话(二)

    首先运行服务端,处于监听状态: 最后运行客户端,就可以实现服务端和客户端之间互相发送消息. 客户端: import os import cv2 import socketremote_IP='127. ...

  8. C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信

     http://blog.csdn.net/guoguojune/archive/2011/02/15/6185301.aspx(原文的格式看着真叫一个舒服) 开发环境  Vs 2008  新建一 ...

  9. python--DenyHttp项目(1)--socket编程:客户端与服务器端

    查找了许多资料,实现了客户端与服务器端的连接,通过虚拟机进行测试 服务器端IP:192.168.37.129 端口1122 客户端IP: 192.168.37.1 端口1122 Server: #co ...

最新文章

  1. WebService:设置服务器提供SOAP1.2的服务
  2. 转载:MFC 获得各类指针、句柄的方法
  3. 4、Hive数据操作,DDL操作,CRUD database,CRUD table,partition,view,index,show命令等
  4. windows常用进程
  5. 图5-5与代码中变量的对应关系
  6. eclipselink_EclipseLink MOXy和用于JSON处理的Java API –对象模型API
  7. MongoDB 凉了?
  8. cvc 降噪_哪款蓝牙耳机降噪效果最好,降噪音质俱佳的蓝牙耳机推荐
  9. 任意文件下载漏洞学习
  10. 国开大学计算机应用实操题作业如何上传,国开电大18秋《计算机应用基础》形考任务作业.doc...
  11. C# 根据模板 导出 Excel 图表 (NPOI组件)
  12. Linux基础知识总结
  13. Gossip协议笔记--谣言、流行病协议
  14. “飞扬小字典” -- 辅助记忆的小工具
  15. 常见的几种多媒体设计框架
  16. 逐步分析类的拆分之案例——五彩斑斓的小球碰撞
  17. UnRaid硬件直通的n种正确姿势
  18. 《牧羊少年奇幻之旅》读书笔记
  19. 创新案例分享 | 建设一体化智能化公共数据平台,赋能数字化改革
  20. ISO14000系列标准特点(转载)

热门文章

  1. MATLAB 仿真分析龙门吊车
  2. Python PIL | Image.resize() 裁剪 缩放图片
  3. linux提取字符串特定结果
  4. 详解python中的round()函数
  5. 本科计算机论文摘要怎么写,★本科计算机论文摘要范文本科计算机论文摘要写...
  6. html图片在ie中有边框,html – 表格的边框在IE中不起作用
  7. php如何使用代码清除bom,使用php清除bom示例
  8. svm 彻底的过程
  9. java中break,continue,標籤實現goto效果(編程思想)
  10. 样例问题 Example question for A4M33MPV course