在使用socket编写服务器程序时,设置服务器绑定的sockaddr_in结构往往会困扰很多同学,sockaddr_in结构中sin_famliy和sin_port(注意要使用htons转换为网络序)就不说了,相信大家已知道。sin_addr是要设置的监听地址。sin_addr类型为:
struct in_addr {
};
这里有几个常用的值:
(1)sin_addr.s_addr = INADDR_ANY;(0x00000000)
(2)sin_addr.s_addr = INADDR_NONE;( 0xffffffff)inet_addr("255.255.255.255")
(3)sin_addr.s_addr = INADDR_LOOPBACK;(0x7f000001)inet_addr("127.0.0.1")
(4)sin_addr.s_addr = inet_addr("192.168.1.211");(192.168.1.211是本地eth0的ip地址)
(5)sin_addr.s_addr = inet_addr("192.168.1.210");(192.168.1.211是本地eth1的ip地址)
第一个值将监听IP设置为0,表示客户端发往本地任意ip上该端口的数据包都可以被服务器接收到。
第二个值将监听IP设置为广播地址,实验发现可以设置成功,但不知道有啥用?请各位大神指教。
第三个值将监听IP设置为本地环回地址,表明该服务仅用于本地socket通信,并且通信数据包不经过网卡,即使不连接网线也可以向127.0.0.1的监听端口发送数据包。
第四、五个值表示将监听IP设置为本地网卡上的IP。
ps:localhost、127.0.0.1和192.168.1.211的区别:localhost是本地主机名,/etc/hosts文件可以设置IP和localhost的对应关系;127.0.0.1是本地环回地址,和本地环回地址通信不经过物理网卡,因次即使不连接网络,127.0.0.1的数据包也可以发送和接收;192.168.1.211是本地网卡IP地址,网卡需上电才可以进行通信。