多网卡 socket 的bind问题

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 错误代码文档,获取有关该错误的详细说明。

 

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

你可能感兴趣的:(windows,socket,网络,application,NetWork,Delphi)