unp读书笔记——udp套接字编程

来源:互联网 发布:淘宝服饰平铺拍摄布光 编辑:程序博客网 时间:2024/04/30 08:03

今日闲来无事,所以打算记录容易被忽略的udp的细节——已连接的UDP套接字和未连接的UDP套接字。

试想一种场景:
服务器进程没有启动,客户端启动启动udp回射进程,发送一行字符串,这时客户端回射进程是永远阻塞与recvfrom等待一个永不出现的服务器应答,还是显示出错信息呢?

1、当我们的客户端UDP套接字没有使用connect指定服务端的地址时,我们称为使用了未连接的UDP套接字,这时客户端会永远阻塞在recvfrom调用等待一个永不出现的服务器应答。
2、当我们的客户端UDP套接字使用connect指定服务端的地址,我们称为使用了已连接的UDP套接字,这时套接字会返回异步错误。这个错误由ICMP提供,read error: Connection refused。

recvfrom异步错误的返回条件:已连接的UDP套接字
首先说明一点,UDP的输出操作,例如sendto,成功返回仅仅表示在接口输出队列中,具有存放所形成的IP数据报的控件。
recvfrom可以返回的信息仅有errno值,它没有办法返回出错数据报的目的IP地址和目的UDP端口。因此,udp的设计决定:除非套接字已经连接,否则异步错误是不会返回到UDP套接字的。

除此,已连接的UDP套接字相比未连接的UDP套接字,有了三个变化:
(1)已连接的UDP套接字不用给输出操作指定目的IP地址和目的端口号。
即,我们不使用sendto,改为write或send。
(2)我们不必使用recvfrom来获悉数据报的发送者,而改用read,recv或recvmsg。因为已连接的UDP套接字,由内核为输入操作返回的数据报只有来自connect所指定连接对等方的数据报。
(3)由已连接UDP套接字引发的异步错误会返回给它们的进程,而未连接的UDP套接字不会接受任何异步错误。

已连接的UDP套接字:
这里写图片描述

0 0
原创粉丝点击