man socket(7)里对该选项的描述:

       SO_BINDTODEVICEBind this socket to a particular device like “eth0”, as speci‐fied in the passed interface name.  If the name is an emptystring or the option length is zero, the socket device bindingis removed.  The passed option is a variable-length null-ter‐minated interface name string with the maximum size of IFNAM‐SIZ.  If a socket is bound to an interface, only packetsreceived from that particular interface are processed by thesocket.  Note that this works only for some socket types, par‐ticularly AF_INET sockets.  It is not supported for packetsockets (use normal bind(2) there).Before Linux 3.8, this socket option could be set, but couldnot retrieved with getsockopt(2).  Since Linux 3.8, it isreadable.  The optlen argument should contain the buffer sizeavailable to receive the device name and is recommended to beIFNAMSIZ bytes.  The real device name length is reported backin the optlen argument.将套接字绑定到指定接口,例如eth0等。如果绑定了接口,这个套接字只能处理由该接口收到的数据。
注意,并不是所有套接字类型都有这个选项。AF_INET套接字支持,但是packet 套接字不支持(不过,可以使用bind函数绑定地址)

如果有多个接口,例如eth0, eth1, ethx......,就可以在创建套接字的时候绑定相应的接口发送数据,例如我的电脑里有两个接口 :

在创建套接字的时候就可以绑定相应的接口发送数据,demo:

/**  Desrciption : 套接字选项SO_BINDTODEVICE使用,需要root权限执行*  Author : mason*  Date : 201809*/#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <errno.h>int main()
{int sock;struct sockaddr_in addr, raddr;char buffer[] = "hello world";/* 指定接口 */struct ifreq nif;char *inface = "eth0";strcpy(nif.ifr_name, inface);/* 创建套接字 */sock = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sock){printf("create socket fail \r\n");return;}else{printf("create socket success \r\n");}if (inet_aton("192.168.80.129", &addr.sin_addr) != 1){printf("addr convert fail \r\n");close(sock);return;}addr.sin_family = AF_INET;addr.sin_port = htons(8000);if (inet_aton("192.168.80.1", &raddr.sin_addr) != 1){printf("addr convert fail \r\n");close(sock);return;}raddr.sin_family = AF_INET;raddr.sin_port = htons(8000);#if 0  //绑定地址if (bind(sock, (struct sockadd *)&addr, sizeof(addr)) != 0){printf("bind fail \r\n");close(sock);return ;}else{printf("bind success \r\n");}#endif/* 绑定接口 */if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&nif, sizeof(nif)) < 0){close(sock);printf("bind interface fail, errno: %d \r\n", errno);return ;     }else{printf("bind interface success \r\n");}/* 发送 */sendto(sock, buffer, sizeof(buffer), 0, ((struct sockadd *)&raddr),sizeof(raddr));close(sock);return;
}

分别绑定eth0, eth1发送数据,抓包如下图,可以看到有不同的源地址发送。

程序执行的时候需要使用sudo权限,不然会提示绑定接口失败。

感觉类似的功能完全可以由bind接口实现,即绑定指定IP地址。

Linux 套接字编程 套接字选项SO_BINDTODEVICE 绑定接口 示例相关推荐

  1. java 函数式编程 示例_Java套接字编程–套接字服务器,客户端示例

    java 函数式编程 示例 Welcome to Java Socket programming example. Every server is a program that runs on a s ...

  2. 【Linux网络】网络编程套接字(上)

  3. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  4. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  5. TCP和UDP套接字编程

    一.Socket简单介绍 如果要在应用层调用传输层的服务,进行相关程序的设计,就要涉及到套接字编程.套接字也称之为Socket,本质上它就是利用传输层提供的一系列Api来进行网络应用程序的设计. 网络 ...

  6. day26-2 基于TCP协议的套接字编程

    目录 基于TCP协议的套接字编程 套接字 套接字工作流程 基于TCP协议的套接字编程(简单) 服务端 客户端 基于TCP协议的套接字编程(循环) 服务端 客户端1 客户端2 基于TCP协议的套接字编程 ...

  7. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

  8. Linux IPv6 UDP套接字编程示例

    udp ipv6套接字编程和ipv4接口类似,参数略有不同,流程都包括创建套接字.绑定地址.发送等. 下面是一个udp ipv6 demo, 包括创建ipv6套接字.绑定地址和发送数据等. 首先先在l ...

  9. linux udp套接字编程获取报文源地址和源端口(二)

    之前项目中涉及udp套接字编程,其中一个要求是获取客户端发过来报文的端口和ip地址,功能很简单,只是对这一块不很熟.之前使用的方法是通过调用recvmsg这个接口,并通过参数msg里面的msg_nam ...

最新文章

  1. 聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
  2. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
  3. ios 重复引用 静态库_iOS 解决一个因三方静态库冲突产生的duplicate symbol的问题...
  4. js如何调用h5的日期控价_微信公众号支付H5调用支付解析
  5. luogu3830 [SHOI2012]随机树
  6. OJ1055: 兔子繁殖问题(C语言计算斐波那契数列/“兔子数列”)
  7. 【Pre蓝桥杯嵌入式】【STM32】Unkown device
  8. ***引发《唐山大地震》 在线下载瞬间中毒
  9. php mongodb长连接吗,PHP - MongoDB连接攻略
  10. SURF源码分析之fasthessian.h和fasthessian.cpp
  11. 操作系统进程通信实验
  12. php在线安装ipa,网页安装ipa
  13. 计算机组成原理复习(第二版)唐朔飞编著(转载请注明出处---https://www.cnblogs.com/qingl)...
  14. 从coursera网站自动下载网课视频(Linux中bash操作)
  15. 自制 计算机主板,三步教你如何DIY电脑主板和CPU的搭配
  16. 荷香莫深湎,终付秋风落。(模拟
  17. win32 API函数大全
  18. PPT加密了如何打开文件
  19. 中华名将索引 - 第一批:廉颇
  20. 直流斩波电路在matlab中的建模与仿真,基于MATLAB/Simulink的直流斩波电路分析

热门文章

  1. java robot 对象_用Java Robot对象实现服务器屏幕远程监视
  2. 计算Be原子基态能级
  3. 围棋棋盘上的波粒二象性
  4. 用神经网络做分子动力模拟 二氟甲烷,二氯甲烷,二溴甲烷并计算键值
  5. java经典50题_JAVA经典算法50题(3)【面试+工作】
  6. 一起学nRF51xx 11 -  ficr
  7. STM32 基础系列教程 33 - Lwip_tcp_client
  8. Android4: HDMI system in ICS
  9. Putty中文乱码的解决方法
  10. 【s操作】上瘾了!继续轻松优雅的解决孩子的初中数学题,matlab入门新方法解题无压力...