1:UDP中可使用connect系统调用
2:UDP中connect操做与TCP中connect操做有着本质区别。
TCP中调用connect会引发三次握手,client与server创建连结.UDP中调用connect内核仅仅把对端ip&port记录下来.
3:UDP中能够屡次调用connect,TCP只能调用一次connect.
UDP屡次调用connect有两种用途:1,指定一个新的ip&port连结. 2,断开和以前的ip&port的连结.
指定新连结,直接设置connect第二个参数便可.
断开连结,须要将connect第二个参数中的sin_family设置成 AF_UNSPEC便可.
4:UDP中使用connect能够提升效率.缘由以下:
普通的UDP发送两个报文内核作了以下:#1:创建连结#2:发送报文#3:断开连结#4:创建连结#5:发送报文#6:断开连结
采用connect方式的UDP发送两个报文内核以下处理:#1:创建连结#2:发送报文#3:发送报文另一点, 每次发送报文内核都由可能要作路由查询.
5:采用connect的UDP发送接受报文能够调用send,write和recv,read操做.固然也能够调用sendto,recvfrom.
调用sendto的时候第五个参数必须是NULL,第六个参数是0.调用recvfrom,recv,read系统调用只能获取到先前connect的ip&port发送的报文.
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.服务器
对一个UDP的套接口屡次调用connect的状况如何?并发
- 链接新的IP和端口
- 断开前面的链接
第一个目的不一样于TCP链接connect的使用:对于TCP链接,connect只能调用一次;针对UDP则能够connect到不一样的server,eg:client须要和多个服务器同时通讯。负载均衡
第二个目的为了断开一个已链接的UDP链接,再次调用connect时,把套接字地址结构的地址簇成员(IPv4为sin_family,IPv6为sin6_family),设置为AF_UNSPEC便可。高并发
性能:当进程知道本身要给同一个目的地址发送多个数据报时,显式链接套接字效率更高。性能
而临时链接未链接的UDP套接字大约会消耗每一个UDP传输三分之一的开销。spa