linux udp之connect函数-连接的udp

概述

connect函数不止作用与tcp连接,同样可以作用于udp连接.不过两者的作用不同.

tcp与udp的connect不同

tcp使用connect函数,客户端发起三次握手协议,在收到对端的确认ack和ack后返回.对端在收到客户端的确认ack后,accept返回.

udp使用connect函数,并没有发起三次握手协议(这本身就是tcp协议内容),内核会记录目的端的ip和port,如果本地没指定port话,内核会自动指定一个port.调用connect,并不会使udp建连.


使用or不使用connect函数的udp区别

原理:

无连接的udp

socket----->sendto()或recvfrom()

连接的udp(使用了connect) 
socket----->connect()----->send()或recv(),read/write.(此时sendto,recvfrom仍可用)


性能:

未连接udp套接字上调用sendto时,内核暂时连接该套接字,发送数据包,然后断开连接.执行下面的步骤.

未链接UDP套接字:
1.链接套接字
2.输出第一个数据包
3.断开套接字
4.链接套接字
5.输出第2个数据包

6.断开套接字



已链接套接字
1.连接套接字
2.输出第一个数据包
3.输出第2个数据包.
n.断开套接口..


使用connect的变化

1.会返回异步错误给应用进程。
为什么调用connect后,会收到返回异步错误? 

1)不管是否调用connect,对端关闭时,内核都会收到错误之前性能看,每次关闭,内核收到错误不知道向谁发送.

2)使用connect内核保持着相关套接字,会向相关套接字发送消息.最明显的就是每次未连接的udp使用sendto会向内核拷贝两次,而连接的udp,即使调用read和write都可以发送,由内核保证目的地址.当内核收到错误时,知道向谁传递这个错误.

3)这个错误形式是什么?icmp消息报文.返回udp port xxxx unreachable.正如1)所说,不论是否调用connect,内核都会收到icmp的错误消息包,对于调用connect的udp程序,read/recvfrom收到的错误,errno=111,ECONNREFUSED,解释为Connection refused.


2.发送:从调用connect以后就可以不使用recvfrom和sendto函数,可以用read和write函数替代.上一步所说由内核保存目的地址.

3.接收:没有链接的UDP套接口将会接受所有发送到绑定端口的数据(任何一个进程只要向UDP绑定端口发送数据,都会被没有链接的UDP套接口接受),已链接套接口只会接受链接的另一方的数据,不接受其它人发送过来的数据.当connect时只能接收目的端ip的数据.


4.已连接的udp套接字还可用来确定某个特定目的地的外出接口.由connect用到udp的一个副作用造成的.:内核选择本机ip地址(多个ip时,且未调用bind显示绑定).本地ip通过为目的ip搜索路由表获得外出接口以及选定接口主ip地址.


多次调用connect

一般有2个目的
1.为套接字指定新的IP和端口号
2.断开套接字.设置要链接的新套接字的地址族为AF_UNSPEC即可。这可能会返回一个错误,EAFNOSUPPORT错误,没有关系.断开套接字连接是在已连接的套接字只上
.




相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页