36. UDP套接字之有连接通信


上一节最后发现服务端不存在客服端并不知道, 会被一直阻塞.


错误回顾

如果你忘了启动服务端, 你会发现客服端依旧被阻塞了, 并且没有报错. 而且发送数据即使没有收到应答的数据也没有报错, 程序仍然处于阻塞状态.

在这里插入图片描述


错误解析

其实在客服端与服务端主机发送UDP数据报之前, 需要一次arp请求和应答交换(我是在一个主机上实验, 所以无法抓取到).

我们在通过抓包可以看到,服务端会响应一个port unreachable的ICMP应答, 不过这个ICMP并不会返回给客户进程, 这个错误是sendto导致的, 而sendto将数据发送出去之后就返回成功了, 而ICMP是在之后才发出来, 所以这个错误也称ICMP异步错误.

在这里插入图片描述

这个错误只会在已连接时, 才会返回给客服进程. 说了这么多次已连接, 那么接下来我们就来看一下怎么才能让UDP已连接.


UDP已连接

客服端通过调用connect完成UDP已连接的状态, 但不同于TCP, UDP调用connect不会出现三次握手的现象, 只是用来记录对端的IP地址和端口号, 然后返回给调用进程.

已连接的UDP相对于未连接的UDP发生部分变化 :

  • 不再给recvfrom输出上面绑定IP地址和端口号, 也不用让sendto获取对端的IP地址和端口号信息; 也就是可以直接调用writeread函数.
  • 可以收到ICMP异步错误.

注意 : UDP使用connect没有三次握手并使connect并不会阻塞, 而是直接返回.

服务端的代码不用就行修改, 客服端的代码修改如下 :


完整代码 : connect_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值