一、 所谓bind,就是指绑定本地接受端口。
指定ip,是为了分辨多ip主机。在有服务端和客户端的UDP中,bind是服务端调用的函数,绑定的是服务端的IP,假设服务端有多个网卡,即会有多个IP,这个时候我们可以选择用bind绑定其中一个IP,那么服务端只接收该IP上某端口的数据。如果bind绑定的是INADDR_ANY,即表示所有发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都由这个服务端进程进行处理。
UDP组播时最好不要提客户端/服务端的概念,而是提发送端/接收端的概念,避免出现逻辑理解混乱,其实这时,发送端==客户端,接收端==服务端。使用udp组播时,发送端用writeDatagrams()函数就可以直接向组播地址IP和port端口发送数据,不用调用bind()绑定IP和port 。接受端则需要调用bind()绑定该组播IP和指定port端口,同时将模式设定为:shared,允许其他接受端绑定,以从该地址获取数据。
以下是别人写的:
1)采用UDP通信时(这里是有客户端和服务器之分才这么说的,若是指定特定端口的UDP对等通信则不一样了),客户端也可以不需要bind()他自己的IP和端口号,而服务器需要bind自己IP地址和端口号。
原因:因为服务器是时时在监听有没有客户端的连接,如果服务器不绑定IP和端口的话,客户端上线的时候怎么连到服务器呢,所以服务器要绑定IP和端口,而客户端就不需要了,客户端上线是主动向服务器发出请求的,因为服务器已经绑定了IP和端口,所以客户端上线的就向这个IP和端口发出请求,这时因为客户开始发数据了(发上线请求),系统就给客户端分配一个随机端口,这个端口和客户端的IP会随着上线请求一起发给服务器,服务收到上线请求后就可以从中获起发此请求的客户的IP和端口,接下来服务器就可以利用获起的IP和端口给客户端回应消息了。
(详解:UDP服务器是怎么知道客户端的IP地址和UDP端口?一般来说有两种方式: 一种是客户端发消息显式地告诉服务器IP地址和端口,消息内容就包括IP地址和UDP端口。另外一种就是隐式的,服务器从收到的包的头部中得到包的源IP地址和端口。)
2)若是没有客户端和服务器之分的程序,即自己指定特定端口的UDP对等通信,则客户端和服务器都需要bind()IP地址和端口了。通常udp服务端根本不需要知道客户端的socket,它直接建立一个socket用于发送即可,udp通信的关键只在于IP和端口。多个客户端如果需要点到点分发,必须给服务端socket循环设置每个客户端的IP并发出,但更常用的是广播分发,服务端socket设定一个X.X.X.255的广播地址并始终向它发送,每个客户端建立的socket只需要绑定这个广播地址便可以收到。(不是很理解)