【Socket网络编程】1.bind()和 INADDR_ANY 解析
bind()和 INADDR_ANY 解析
linux网络编程之UDP通信 http://blog.sina.com.cn/s/blog_c2f250bd0101ii14.html 该博客讲了tcp和udp的一些常用参数
bind()
解析
当使用socket()
创建套接字后,只赋予其所使用的协议,并未分配地址。
在接受其它主机的连接前,必须先调用bind()为套接字分配一个地址。
bind()
一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,关联一个指定的本地端口和IP地址。
bind()
有三个参数:
sockfd
, 表示使用bind函数的套接字描述符my_addr
, 指向sockaddr结构(用于表示所分配地址)的指针addrlen
, 用socklen_t字段指定了sockaddr结构的长度
如果发生错误,函数返回值为-1,否则为0。
- 原型
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
一般接收端要使用bind()
。发送端不需使用bind()
。
bind()
一般用于服务器(接收)端,将一个套接字与一个套接字地址结构相关联,比如,关联一个指定的本地端口和IP地址。
-
作为接收端,当你调用bind()函数绑定IP时使用【
INADDR_ANY
】,表明接收来自任意IP、任意网卡的发给指定端口的数据。 -
作为发送端,当你调用bind()函数绑定IP时使用【
INADDR_ANY
】,表明使用网卡号最低的网卡进行发送数据,也就是UDP数据广播。 -
对于sendto()函数,成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno中。
-
对于recvfrom()函数,成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。 recvfrom()函数不收到数据是不会返回的,而要一直阻塞。若不要阻塞,可用非阻塞模式来接收数据。
-
错误码参考博客 https://blog.csdn.net/qishiai819/article/details/80093659
服务器端 需要bind()绑定ip地址和端口
客户端 可以不需要bind()绑定ip地址和端口,但是也可以绑定
如果服务器程序就绪后一上来就要发送数据给客户端,那么服务器就需要知道客户端的地址信息和端口,那么就不能让客户端的地址信息和端口号由客户端所在操作系统分配,而是要在客户端程序指定了。
怎么指定?那就是用bind()函数。 https://blog.csdn.net/qq_29344757/article/details/71616748
在多播中,无论是发送还是接收端都必须绑定一个本地地址(需要使用bind()
函数),这个地址就是多播通信时处理信息的端口
【socket
绑定的ip为 INADDR_ANY
的意义】
https://blog.csdn.net/qq_26399665/article/details/52932755
【INADDR_ANY】 这个宏能够让程序员在不知道本机IP地址的情况下,使用它来代表本机所有接口的IP地址。也就是说,使用这个宏作为监听地址的话,不管本机有多少个接口,socket都会监听。
举个例子,假设一个主机有inter1,inter2,,inter3三个接口,如果一个socket绑定了INADDR_ANY的地址和8000的端口,那么,从客户端过来的一个UDP包到达该主机,不管客户端connect的是inter1,inter2,inter3中的哪个地址,都会被该socket接收到。如果此时主机还要再建立一个新的socket,使用inter1接口和端口8000,将会失败,因为这个端口和地址已经被第一个socket监听了。