14.udp与connect

UDP在调用sendto发送数据时候,如果发送目的地不可达(比如说服务器没有启动),sentdo函数不会错误返回。sendto函数正确返回仅表示接口输出队列上为IP数据包留出空间,但并不表示数据成功到达了目的地。这种错误称之为异步错误。

 

如果对UDP调用connect函数,则可以保证异步错误能够正确的返回给应用进程,在调用connect时候,如果目的地不可达,则会返回给应用进程。

 

UDP调用connect不会经过三路握手像TCP一样建立一个链接,对于调用过connect的udp接口称之为已链接UDP套接口,它只包含下面3种变化。

 

1.会返回异步错误给应用进程。

2.从调用connect以后就不许要再使用recvfrom和sendto函数,可以用read和write函数替代。

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

 

注意的就是UDP调用connect没有建立链接。

 

多次调用connect,一般有2个目的

1.为套接口指定新的IP和端口号

2.断开套接口

 

第一个目的很简单,填入新的IP和端口即可。第2个只要设置要链接的新套接口的地址族为AF_UNSPEC即可。这可能会返回一个错误,但这不要紧。

 

一般来说客户端和服务器是多对1关系,所以客户端比较常见调用connect,服务器则不常见(当然这并不是指服务器不可以connect,如果你确定只给某一个客户端服务,则依然可以调用connect)。

 

已链接套接口相对于未链接套接口在性能上有优势。

 

未链接UDP套接口:

1.链接套接口

2.输出第一个数据包

3.断开套接口

4.链接套接口

5.输出第2个数据包。

。。。。。。。。。。。

 

已链接套接口

1.连接套接口。

2.输出第一个数据包

3.输出第2个数据包。

。。。。。。。。。。

n.断开套接口。

 

已链接的套接口可以通过getsockname来获取地址和端口。

你可能感兴趣的:(应用服务器)