Qt使⽤UDp通信、套接字socket的成员函数bind()的作⽤
⼀、所谓bind,就是指绑定本地接受端⼝。
指定ip,是为了分辨多ip主机。在有服务端和客户端的UDP中,bind是服务端调⽤的函数,绑定的是服务端的IP,假设服务端有多个⽹卡,即会有多个IP,这个时候我们可以选择⽤bind绑定其中⼀个IP,那么服务端只接收该IP上某端⼝的数据。如果bind绑定的是
INADDR_ANY,即表⽰所有发送到服务器的这个端⼝,不管是哪个⽹卡/哪个IP地址接收到的数据,都由这个服务端进程进⾏处理。
qt进程间通信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只需要绑定这个⼴播地址便可以收到。(不是很理解)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论