Connect函数,在TCP协议中客户端会使用,作用就是引发三次握手,而UDP虽然没有握手协议但是connect也可以在其中发挥重要作用,即把目标ip&port记录下来,即绑定。[ 区分:bind()函数指明了本地地址/端口(包括ADDR_ANY, 通配所有本地网络接口);connect()可以用来指明目的地址/端口]。
UDP客户端在建立了插口后会直接用sendto函数发送数据,还隐含了一个操作,那就是在发送数据之前,UDP会首先为该插口选择一个独立的UDP端口(在1024-5000之间),将该插口置为已绑定状态。如果一个UDP客户端在建立了插口后首先用bind函数指明了本地地址/端口,也是可以的,这样可以强迫UDP使用指定的端口发送数据。(事实上,UDP无所谓服务器和客户端,这里的界限已经模糊了。)
(1)UDP中可以多次调用connec,TCP只能调用一次connect;UDP多次调用connect有两种用途:1 指定一个新的ip&port连结;2 断开和之前的ip&port的连结。指定新连结,直接设置connect第二个参数即可。断开连结,需要将connect第二个参数中的sin_family设置成 AF_UNSPEC即可。
(2)UDP中使用connect可以提高效率。
普通的UDP发送两个报文内核做了如下:#1建立连结#2发送报文#3断开连结#4建立连结#5发送报文#6断开连结。而采用connect方式的UDP发送两个报文内核如下处理:#1建立连结#2发送报文#3发送报文另外一点,每次发送报文内核都由可能要做路由查询。
(3)UDP中使用connect的好处:1:会提升效率,前面已经描述了。2:高并发服务中会增加系统稳定性。原因:假设client A 通过非connect的UDP与server B,C通信。B,C提供相同服务。为了负载均衡,我们让A与B,C交替通信。A 与 B通信IPa:PORTa <----> IPb:PORTb;A 与 C通信IPa:PORTa'<---->IPc:PORTc 。假设PORTa 与 PORTa'相同了(在大并发情况下会发生这种情况),那么就有可能出现A等待B的报文,却收到了C的报文.导致收报错误。解决方法内就是采用connect的UDP通信方式。在A中创建两个udp,然后分别connect到B,C。
参考文献
[1] http://blog.csdn.net/wannew/article/details/18218619
[2] http://blog.csdn.net/ixidof/article/details/5275213