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

发布于:2021-10-27 11:03:58

今日闲来无事,所以打算记录容易被忽略的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套接字:

相关推荐

最新更新

猜你喜欢