在 《TCPIP 网络编程-02-套接字类型与协议设置》 中通过 示例地址:https://github.com/XBoom/network-ip.git 中的 apps/socket/03/
学习了基于UDP的CS通信,可以发现
Client
是不需要发起connect
的,直接使用sendto
进行发送Server
不需要listen/accept
,而是直接通过recvfrom
进行数据接收
新增了两个函数 sendto
与 recvfrom
1 |
|
写一个基于UDP的回声CS,示例地址:https://github.com/XBoom/network-ip.git 中的 apps/socket/07/
。运行结果如下
1 | ./client 127.0.0.1 5555 |
从上面可以看出,**CS都不需要连接,**那么客户端地址又是如何分配的,答案是在 sendto
的时候,首次调用 sendto
的时候会自动给套接字分配 IP 与端口,然后一直沿用到套接字关闭。
所以
-
客户端其实可以使用
connect
当然此处的作用就不是连接,而是分配地址(TCP 也是在这个时候分配的地址); -
又因为套接字有了地址之后,就可以不用
sendto
而直接使用write
进行发送; -
而且CS均只需要一个套接字(即只需要一个套接字就能和多个主机通信)

所以最后将示例 7 修改为 示例8:https://github.com/XBoom/network-ip.git 中的 apps/socket/08/
,效果一致。通过 connect
进行地址分配,通过 read/write
进行消息发送接收。运行结果如下:
1 | [root]#./server 5555 |
TIPS:
sendto
函数主要分为三个阶段
- 向 UDP 套接字注册 IP 地址与端口
- 传输数据
- 删除 UDP 套接字中注册的 IP 地址与套接字
sendto
函数每次调用都执行上述三个阶段,将未注册 IP 地址与端口的称为未连接的 UDP 套接字。用于向不同的目标发送数据相反,通过
connect
将 IP 地址与端口注册到 UDP 套接字,称为 已连接的 UDP 套接字。用于向同一个目标发送数据
参考文档
- 《TCPIP 网络编程》