分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

delphi中请问,在多网卡中socket的bind (ip地址采用 sin_addr.S_un.S_addr=INADDR_ANY)是那块网卡的ip

1楼:最简单方法,同时运行另外一个程序,bind一个地址,如果成功,则不是这个地址,否则。。。
2楼:接收本机所有网络接口的数据,如果绑定则接收绑定接口的数据
3楼:我是说绑定特定IP则会接收那个接口的数据
7楼:If an application does not care what local address is assigned, specify the manifest constant value ADDR_ANY for the sa_data member of the name parameter. This allows the underlying service provider to use any appropriate network address, potentially simplifying application programming in the presence of multihomed hosts (that is, hosts that have more than one network interface and address).
抄自MSDN,按这样说,是不是意味着我们用ADDR_ANY的时候就不会去关心到底bind了哪一块网卡,如果你比较关心这一点,不如直接去bind某一块,而不会使用ADDR_ANY.
8楼:INADDR_ANY是所有网卡的地址
9楼:是由底层操作系统选择的任何一块可用的网卡

发表于:2005-12-11 20:39:09

如果在建立socket的时候sin_addr .s_addr = INADDR_ANY;
这样的话网卡邦定是随机邦定的吗?在有多网卡的机器中
有这样一个问题,比如我有两个网卡 ip分别为128.128.1.14 和128.128.2.15 子网掩码分别是255.255.255.0和255.255.0.0,如果我这时候用INADDR_ANY参数向128.128.1.255发送数据,这是一个广播包(从1.14网卡发送)还是一个单播包(从2.15网卡发送)?,我试验了几十次用ethreal抓包,发现有一次被当作了单播包,其他都当成了广播包从1.14的网卡发送出去了,但是后来一直都没办法重现,都被当成广播的了,我不知道是我自己那次试验弄错了还是怎么样 特向大家请教,在多网卡环境的邦定过程

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)

如果需要使用特定的本地终结点,请使用 Bind 方法。必须先调用 Bind,然后才能调用Listen 方法。除非需要使用特定的本地终结点,否则不必在使用 Connect 方法之前调用 Bind。对无连接和面向连接的协议都可以使用Bind 方法。

在调用 Bind 之前,必须首先创建打算从其进行数据通信的本地 IPEndPoint。如果您不介意分配哪个本地地址,则可以用 IPAddress.Any 作为地址参数创建一个 IPEndPoint,这样,基础服务提供程序将会分配最适合的网络地址。如果您有多个网络接口,这将有助于简化您的应用程序。如果您不介意使用哪个本地端口,则可以创建一个使用 0 作为端口号的IPEndPoint。在这种情况下,服务提供程序将会分配一个可用的端口号(介于 1024 和 5000 之间)。

如果使用上面的方法,您可以通过调用 LocalEndPoint 获知所分配的本地网络地址和端口号。如果当前使用的是面向连接的协议,则直到您调用了Connect 或 EndConnect 方法后,LocalEndPoint 才会返回本地分配的网络地址。如果当前使用的是无连接协议,则直到完成一个发送或接收操作后,才可访问该信息。

 

如果打算接收多路广播的数据报,则必须使用多路广播端口号调用 Bind 方法。

 

如果打算通过使用 ReceiveFrom 方法来接收无连接的数据报,则必须调用 Bind 方法。

 

如果在调用 Bind 方法时接收到 SocketException,则可以使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。

 

当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪。

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

多网卡 socket 的bind问题相关推荐

  1. socket接口技术和相关函数(socket,bind,listen,accept)

    socket: 套接字,是一种接口技术,它封装了TCP/IP通信协议,使用它可以让计算机之间通过网络传输数据,所有的操作系统使用的都基于socket的接口进行网络通信的. 不光可以用于网络间通信,还可 ...

  2. Linux网络编程——socket、bind、listen、accpet、connect、read和write

    Linux网络编程 基础理论 1.TCP/UDP/端口号 2.字节序 一.socket服务器与客户端的开发步骤 二.具体使用步骤 1.socket(创建连接协议) 2.bind(地址准备好) 3.li ...

  3. Redis端口占用 Could not create server TCP listening socket *:6379: bind: Address already in use

    在使用redis-server命令时发现启动redis失败,说端口号6379已经在使用了. 10503:M 16 Nov 2022 17:29:01.118 # Warning: Could not ...

  4. Redis:报错Creating Server TCP listening socket *:6379: bind: No error

    错误: window下启动redis服务报错: Creating Server TCP listening socket *:6379: bind: No error 原因: 端口6379已被绑定,应 ...

  5. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  6. socket不能bind请求的地址_socket通信原理

    一.什么是Socket? 1.Socket是一个网络通信的套接字(接口) 二.Socket的实现流程? 1.Socket在客户端和服务端发生了什么? 服务器:a.socket()创建socket对象b ...

  7. linux socket API / bind

    一.函数原型 #include <sys/socket.h> int bind (int __fd, const struct sockaddr * __addr, socklen_t _ ...

  8. 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 什么是socket 所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络 ...

  9. socket不能bind请求的地址_深入浅出讲解:php的socket通信

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 你 ...

最新文章

  1. 五分钟看懂抓包神技:DPDK
  2. 莫斯科保卫战之PHP-502 Bad Gateway
  3. python列表浅复制_Python列表的深复制和浅复制示例详解
  4. Leetcode 39 组合总和 (每日一题 20210806)
  5. Mahout分步式程序开发 聚类Kmeans
  6. hadoop的伪分布安装(低版本)
  7. hbuilder php mysql_xampp本地服务器+HBuilder配置php环境
  8. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引
  9. Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决
  10. 自动化运维工具puppet的使用
  11. 文本框样式 html,HTML文本框样式大全
  12. springcloud之gateway服务网关
  13. 九、瞰景Smart3D Viewer浏览器
  14. 嵌入式 Linux 入门 环境篇(一、开发板初体验)
  15. 8年Android开发教你如何写简历,附超全教程文档
  16. SAP QM 特性导出及定性定量
  17. ios9提取安装包ipa_iOS获取ipa包以及图片资源
  18. 大话西游免费版最新服务器是,2020年4月1日服务器数据互通公告
  19. Asp.net 周旭龙 系列总结
  20. 关于啤酒和尿布故事的真相

热门文章

  1. 第一章:Reac入门 与 第二章:React面向组件编程
  2. 如何利用百度好看视频优化来做关键词排名?
  3. 社区矫正人员智能管控系统
  4. 2023年宁波市网络安全大赛(天一永安杯)-训练赛
  5. 漫画:如果谈恋爱像是写代码
  6. 【Unity】OnePieceFTG(四)战斗环境
  7. 有一个天平 7克、2克砝码各一个 三次将140克盐分成50g 90g各一份?
  8. json序列化按顺序输出
  9. Linux DRM 相关知识
  10. 顺藤摸瓜之3D结构光原理