INADDR_ANY和INADDR_BROADCAST的含义上说明

INADDR_ANY 、INADDR_LOOPBACK 、INADDR_BROADCAST这三个常量在文件中的定义如下:

#define INADDR_ANY              (u_long)0x00000000
#define INADDR_LOOPBACK         0x7f000001
#define INADDR_BROADCAST        (u_long)0xffffffff

INADDR_ANY选项

一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。在服务端中,常常将需要绑定IP地址设置为INADDR_ANY。

INADDR_ANY代表指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”;表示本地上所有的IP地址。

因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。

比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐?
所以你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到。

 // Bind the socket to any address and the specified port.
 //服务端
 sockaddr_in RecvAddr;
 RecvAddr.sin_family = AF_INET;
 RecvAddr.sin_port = htons(6000);
 RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

 iResult = bind(RecvSocket,(sockaddr*)&RecvAddr,sizeof(RecvAddr));
 if (iResult != 0) 
 {
     printf("bind failed with error %d\n", WSAGetLastError());
     return 1;
 }

INADDR_LOOPBACK选项

INADDR_LOOPBACK, 总是代表经由回环设备的本地主机,往往是127.0.0.1, 表示只能收到127.0.0.1上面的连接请求,表示客户端和服务端在同一个机器上。

INADDR_BROADCAST选项

INADDR_BROADCAST 代表255.255.255.255的广播地址,广播消息不会在当前路由器进行转发,作用范围只能在当前局域网。

当在客户端网络编程中,如绑定的地址是INADDR_BROADCAST表示是广播通信。

//填充服务器socket信息
SOCKADDR_IN addrServer;
addrServer.sin_family   = AF_INET;
//服务器的应用程序端口
addrServer.sin_port     = htons(6000);
//要连接的服务器的IP地址,INADDR_BROADCAST代表255.255.255.255,是广播
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST) ;

参考文章:
https://blog.csdn.net/balabaladyc/article/details/16873755
https://www.cnblogs.com/lakeone/p/5770290.html

你可能感兴趣的:(网络编程)