1.   通过bind机制,   socket必须要调用bind才能发送tcp包。 bind调用时需要一个ip地址。一般一台机器的多网口都要配置不同的ip地址(路由器除外,路由器是一个网桥设备,只是负责转发包,所以其它的端口一般没有ip地址)。

2.   通过ioctl来设置打开的socket.     (ioctl (fd, SIOCGIFINDEX, &ifr)==0;

TCP编程时不管是客户端还是服务器端,都要调用bind后才能连接/收发数据。

UDP在客户端时可以不调用bind而直接使用recvfrom/sendto来收发数据。

在客户端一般是本地地址选择INETADDR_ANY, 表示所有网络接口。

代码如下:

#include <stdio.h>;
#include <string.h>;
#include <sys/socket.h>;
#include <netpacket/packet.h>;
#include <net/ethernet.h>;
#include <sys/ioctl.h>;
#include <net/if.h>;
#include <assert.h>;

int
main ()
{
        struct sockaddr_ll sll;
        int fd;
        struct ifreq ifr;
        char *dev;

fd = socket (PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

dev = "eth0";
        strncpy ((char *)ifr.ifr_name, dev, sizeof(ifr.ifr_name));
        assert (ioctl (fd, SIOCGIFINDEX, &ifr)==0);

memset (&sll, 0, sizeof(sll));
        sll.sll_family = AF_PACKET;
        sll.sll_protocol = htons (ETH_P_ALL);
        sll.sll_ifindex = ifr.ifr_ifindex;

assert (bind (fd, (struct sockaddr *)&sll, sizeof(sll))==0);

}

##############################################################

Windows网络编程总结(一)
作者:   Kendiv
出处:   CSDN.NET

  关于bind:

  INADDR_ANY   的具体含义是,绑定到0.0.0.0。此时,对所有的地址都将是有效的,如果系统考虑冗余,采用多个网卡的话,那么使用此种bind,将在所有网卡上进行绑定。在这种情况下,你可以收到发送到所有有效地址上数据包。

  例如:

  SOCKADDR_IN   Local;

  Local.sin_addr.s_addr   =   htonl(INADDR_ANY);

  
  另外一种方式如下:

  SOCKADDR_IN   Local;

  hostent*   thisHost   =   gethostbyname( " ");

  char*   ip   =   inet_ntoa(*(struct   in_addr   *)*thisHost-> h_addr_list);

  Local.sin_addr.s_addr   =   inet_addr(ip);

  在这种方式下,将在系统中当前第一个可用地址上进行绑定。在多网卡的环境下,可能会出问题。

  
  最常见的方式:

  const   char   LocalIP[]   =   "192.168.0.100 ";

  SOCKADDR_IN   Local;

  Local.sin_addr.s_addr   =   inet_addr(LocalIP);

  bind(socket,   (LPSOCKADDR)&Local,   sizeof(SOCKADDR_IN)

  bind的安全问题:

  如果你在bind时,使用了INADDR_ANY那么,你将可以在所有有效的地址上进行监听,但是Socket有一个特性:可在同一端口上绑定多个Socket。

  让我们看看下面的情况:假设你的系统只有一个IP:192.168.0.100,你希望bind到4096端口。对于下面的两种bind,当数据包到达时,谁会接收到呢?

  Local.sin_addr.s_addr   =   htonl(INADDR_ANY);

  Local.sin_addr.s_addr   =   inet_addr(“192.168.0.100”);

  WinSocke库是这样处理的:谁绑定的最明确,谁获取数据包。显然,第二种bind将获取到达的数据包。如果避免这种情况呢?使用SO_EXECLUSINEADDRUSE选项。需要注意的是,此选项在Windows   NT   4   Service   Pack   4以后(包括SP4)才可以使用。

  示例代码:

  #ifndef   SO_EXECLUSINEADDRUSE

  #define   SO_EXECLUSINEADDRUSE   ((int)(~SO_REUSEADDR))

  #endif
  

  SOCKADDR_IN   Local;

  BOOL   val   =   TRUE;

  
  Local.   sin_family   =   AF_INET;

  Local.   sin_port   =   htons(4096);

  Local.sin_addr.s_addr   =   htonl(INADDR_ANY);

  
  setsocketopt(socket,

  SOL_SOCKET,

  SO_EXECLUSINEADDRUSE,

  (char*)&val,

  sizeof(val));

  
  bind(socket,   (LPSOCKADDR)&Local,   sizeof(SOCKADDR_IN)

socket通过多网卡收发数据相关推荐

  1. Linux中利用RAW SOCKET直接通过网卡收发数据

    https://blog.csdn.net/oohaha_123/article/details/8597597

  2. linux 网络编程:使用两线程实现socket同时收发数据

    http://blog.csdn.net/li_wen01/article/details/52665505 工作中最近有使用到socket 向客户端同时发送和接收数据,因为是嵌入式linux设备,且 ...

  3. linux网络编程:使用多进程实现socket同时收发数据

    转载:http://blog.csdn.net/li_wen01/article/details/52685844 前面已讲过使用一个进程实现服务端和客户端P2P通信的实例,但是它只能同时处理一个客户 ...

  4. php socket发数据打印,PHP向socket服务器收发数据的方法

    这篇文章主要介绍了PHP向socket服务器收发数据的方法,分析了socket收发数据的方法,并介绍了socket常用函数,需要的朋友可以参考下 本文实例讲述了PHP向socket服务器收发数据的方法 ...

  5. 设置非阻塞socket收发数据

    非阻塞式I/O包括非阻塞输入操作,非阻塞输出操作,非阻塞接收外来连接,非阻塞发起外出连接.包括的函数有:read, readv, recv, recvfrom, recvmsg, write, wri ...

  6. linux网卡发送数据包流程,linux内核Ethernet以太网卡驱动收发数据过程

    linux内核Ethernet以太网卡驱动收发数据过程 linux内核Ethernet以太网卡驱动收发数据过程 下图简单描述了网卡驱动与Linux内核之间的联系: 关于上图的一些说明: 系统初始化: ...

  7. 【过程记录 】windows和ubuntu两台电脑局域网进行socket通信收发数据和传输文件

    实验图片和前期准备: ubuntu作为服务端,windows客户端传输数据和文件: windows作为服务端,ubuntu作为客户端: 实验图片和前期准备: 服务端发送和接受i: 客户端接收服务端的时 ...

  8. Linux内核网络结构,和收发数据基本流程

    不管是大型虚拟化云网络,还是嵌入式物联网系统,Linux网络都扮演着重要的角色.借用一句话说,如果说网络是信息系统的基石,那么Linux网络系统就是基石中的钢筋.它经过几十年的发展,它千锤百炼,几乎包 ...

  9. tun/tap虚拟网卡收发机制解析

    文章目录 收发机制原理 共性 虚拟网卡和物理网卡的通信 网络传输包格式 接收机制 发送机制 服务器端的转发机制 本章要研究的是openxxx的收发原理,实际上研究就是研究tun/tap网卡驱动的相关原 ...

最新文章

  1. 3.strcpy使用注意(3)
  2. 操作系统(八)进程状态的转换以及进程组织方式
  3. fastjson safemode_它又又又来了,Fastjson 最新高危漏洞来袭!
  4. 核心动画05-CAAnimationGroup
  5. LNMP服务跨省迁移的解决方案
  6. leetcode50:Pow(x, n)详解——pygo
  7. Drools创建Maven工程
  8. UVA10424 Love Calculator【水题】
  9. 泛型列表(List)的搜索和排序
  10. C程序设计案例(牛顿迭代法求高次方程的根)
  11. HTML基础入门 第1天课堂笔记
  12. 神经网络物联网未来发展趋势怎么样
  13. 【C语言】1-100求和;1-N求和
  14. 计算机硬件数据统计实验报告,实验二数据统计01
  15. 性能测试理论(一)之性能测试方法与流程
  16. Codeforces Round #439 (Div. 2) E. The Untended Antiquity
  17. python实践——时间序列分析建模理论及代码实现
  18. 初入Linux——软件安装
  19. 计算机系统操作高级工考试题,计算机系统操作高级工试题和答案.doc
  20. N-ary 题型总结

热门文章

  1. Python代码调试方法
  2. pythondjango项目集成_[Python]将Wagtail整合到Django2项目中
  3. 【opencv】3.在一个opencv窗口中显示多个视频界面、画箭头、画掉头箭头
  4. Java NIO学习系列四:NIO和IO对比
  5. VisualVM——JDK自带的性能分析工具
  6. 刷题-CC150-Java实现
  7. Mybatis的ResultMap的使用
  8. 【数字智能三篇】之三: 一页纸说清楚“什么是深度学习?”
  9. 程序员面试题精选100题(31)-从尾到头输出链表[数据结构]
  10. 学生档案管理系统(续)