多网卡 socket 的bind问题

来源:互联网 发布:百度 seo 编辑:程序博客网 时间:2024/06/03 22:57

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

 

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

 

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

 

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

 

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 穷山村的娘和儿子长篇全文阅读 棉花地里弄娘 福林与娘亲怀孕全文下载 和娘亲的故事福林 福林与娘亲出去打工 福林和娘亲共赴云雨 玉玉米米地地日日刘寡 玉米地和娘的民儿 慢点 民儿和娘玉米地的故事 第2段 民儿和娘在玉米地热逼 玉米地民儿与娘故事全文下载 玉米地娘和儿怀子小说 娘亲祖母共夫全集 小说下载 奶奶王珍珠怀孕txt 红高粱九儿玉米地视频 娘亲怀了我的种 民儿和娘玉米地故事 快抽出去外婆会怀孕的 民儿玉米地妈全给你 民儿和娘玉米地的小说 第章母亲播种危险期怀孕 儿子今晚后妈随便你怎么弄说说 同学说要看我骑他妈我说可以 荒村野性全文阅读目录 小成和后妈全文免费阅读文章 小诚和后妈全文免费阅读 娘亲在玉米地河边 我和娘亲玉米 娘亲给儿生个娃大结局 在玉米地插娘亲短文 在玉米地插娘亲电影 王来地里与娘激战2 在玉米地插娘亲播放 孩子别谢了我是你妈 臭小子 别急妈咪又不是不给你 粉嫩娘亲全文阅读全文 你的好粗妈v好痛 乡村孽缘上了王雪琴101一0 乡村小神医之情缠玉米地 乡村孽缘长篇小说全文免费阅读 乡村孽缘王雪琴怀孕是第几章