UDP中的Connect

        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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值