服务器端的 bind 函数的第二个参数有个地址,服务器端要地址干什么?解决方案
服务器端的 bind 函数的第二个参数有个地址,服务器端要地址干什么?
下面代码来自《windows网络编程》第二版,第10页
1、服务器端为什么需要地址? 客户端就好理解了,因为客户端发起连接需要一个目标。
2、上面那里如果设定一个具体的地址,比如“1.1.1.1”,会有什么结果
3、INADDR_ANY 是啥意思? 看 ANY 的意思,好像是允许任何地址向服务器发起连接。
------解决方案--------------------
解释:一台服务器有几个地址,比如回环地址“127.0.0.1”,比如内网地址“192.168.*”还会有外网地址,同时有些服务器会有多个网卡,有多个外网地址。
1、bind不同的地址会有不同的效果,绑定回环的话,只能在本机的客户端同样以回环地址连接,绑定内网的话,只能同一个内网的连,外网的话就可以接收到外网的连接。
2、如果你的网卡不是设置的“1.1.1.1”的网络地址的话,绑定操作会失败,绑定不同的地址,效果如上
3、INADDR_ANY相当于“0.0.0.0”即“所有的地址”,外网或者内网的客户端可以通过相应的外网或者内网地址连到服务器上
------解决方案--------------------
tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);可以通过服务器的任一网卡和外界通信。如果换成某个网卡的ip地址表示通过这个网卡和外界通信。
------解决方案--------------------
------解决方案--------------------
INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
一般来说,在各个系统中均定义成为0值。例如MontiVista Linux中在/usr/include/netinet/in.h定义为:
/* Address to accept any incoming messages. */
#define INADDR_ANY ((in_addr_t) 0x00000000)
一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。
——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。
如果你的服务器有多个网卡(每个网卡上有不同的IP地址),而你的服务(不管是在udp端口上侦听,还是在tcp端口上侦听),出于某种原因:可能是你的服务器操作系统可能随时增减IP地址,也有可能是为了省去确定服务器上有什么网络端口(网卡)的麻烦
—— 可以要在调用bind()的时候,告诉操作系统:“我需要在 yyyy 端口上侦听,所以发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。例如:
Proto Recv-Q Send-Q Local Address Foreign Address (state)
……
udp4 0 0 *.7913 *.*
udp4 0 0 *.7911 *.*
tcp4 0 0 *.ftp *.* LISTEN
……
……
以上这些是网络侦听的情况,其中Local Address 为 “*.ftp”、“*.7911”等,代表了服务程序绑定了服务器的所有网卡。
下面代码来自《windows网络编程》第二版,第10页
- C/C++ code
SOCKET s; SOCKADDR_IN tcpaddr; int port = 5150; s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); tcpaddr.sin_family = AF_INET; tcpaddr.sin_port = htons(port); tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);//这里有问题 bind(s, (SOCKADDR*)&tcpaddr, sizeof(tcpaddr));
1、服务器端为什么需要地址? 客户端就好理解了,因为客户端发起连接需要一个目标。
2、上面那里如果设定一个具体的地址,比如“1.1.1.1”,会有什么结果
3、INADDR_ANY 是啥意思? 看 ANY 的意思,好像是允许任何地址向服务器发起连接。
------解决方案--------------------
解释:一台服务器有几个地址,比如回环地址“127.0.0.1”,比如内网地址“192.168.*”还会有外网地址,同时有些服务器会有多个网卡,有多个外网地址。
1、bind不同的地址会有不同的效果,绑定回环的话,只能在本机的客户端同样以回环地址连接,绑定内网的话,只能同一个内网的连,外网的话就可以接收到外网的连接。
2、如果你的网卡不是设置的“1.1.1.1”的网络地址的话,绑定操作会失败,绑定不同的地址,效果如上
3、INADDR_ANY相当于“0.0.0.0”即“所有的地址”,外网或者内网的客户端可以通过相应的外网或者内网地址连到服务器上
------解决方案--------------------
tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);可以通过服务器的任一网卡和外界通信。如果换成某个网卡的ip地址表示通过这个网卡和外界通信。
------解决方案--------------------
------解决方案--------------------
INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
一般来说,在各个系统中均定义成为0值。例如MontiVista Linux中在/usr/include/netinet/in.h定义为:
/* Address to accept any incoming messages. */
#define INADDR_ANY ((in_addr_t) 0x00000000)
一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。
——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。
如果你的服务器有多个网卡(每个网卡上有不同的IP地址),而你的服务(不管是在udp端口上侦听,还是在tcp端口上侦听),出于某种原因:可能是你的服务器操作系统可能随时增减IP地址,也有可能是为了省去确定服务器上有什么网络端口(网卡)的麻烦
—— 可以要在调用bind()的时候,告诉操作系统:“我需要在 yyyy 端口上侦听,所以发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。例如:
Proto Recv-Q Send-Q Local Address Foreign Address (state)
……
udp4 0 0 *.7913 *.*
udp4 0 0 *.7911 *.*
tcp4 0 0 *.ftp *.* LISTEN
……
……
以上这些是网络侦听的情况,其中Local Address 为 “*.ftp”、“*.7911”等,代表了服务程序绑定了服务器的所有网卡。