如果你在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);