Unix网络编程—基本UDP套接字编程

时间:2021-10-07 22:28:19
第四章、基本UDP套接字编程
1、概述
UDP是无连接不可靠的数据报协议。常见应用程序:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)
①客户不与服务器建立连接,而是只管使用sendto函数给服务器发送数据报,必须指定目的地址作为参数
②服务器不接受来自客户的连接,而是只管调用recvfrom,等待来自某个客户的数据到达
③recvfrom将与所接收的数据报一道返回客户的协议地址,因此服务器可以把响应发送给正确的客户
Unix网络编程—基本UDP套接字编程

2、recvfrom和sendto函数
ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int flags, struct sockaddr *from,socklen_t *addrlen);
ssize_t sendto(int sockfd,const void *buff,size_t nbytes,int flags, const struct sockaddr *to,socklen_t *addrlen);
前三个参数等同于read和write:描述符、指向读入或写出缓冲区的指针、读写字节数
①sendto的to参数指向一个含有数据报接受者的协议地址的套接字地址结构,大小由addrlen参数指定(整数值)
②recvfrom的from参数指向一个由该函数返回的数据报发送者的协议地址的套接字地址结构,字节数放在addrlen返回给调用者
③recvfrom最后两个参数类似于accept最后两个参数:TCP(谁发起的连接) UDP(谁发送的数据报)
④sendto最后两个参数类似于connect最后两个参数:TCP(与之建立连接的协议地址) UDP(数据报发往的协议地址)

3、客户/服务器程序
①函数永不终止,因为UDP是无连接的协议,没有像TCP中EOF之类的东西
②大多数TCP服务器是并发的,而大多数UDP服务器是迭代的,单个服务器进程处理所有客户
③UDP层隐含有排队发生,每个套接字都有一个接收缓冲区,用于存放所到达的数据报。当进程调用recvfrom时,缓冲区下一个数据报以FIFO顺序返回给进程

4、数据报的丢失
如果数据报丢失,客户将永远阻塞于recvfrom调用
防止的一般方法:设置一个超时(不完整的解决办法)——无法判断是数据报没到达服务器,还是服务器应答没到达客户

5、服务器进程未运行
异步错误:由sendto引起,但是sendto本身却成功返回

6、服务器获取信息
Unix网络编程—基本UDP套接字编程

7、UDP的connect函数
没有三路握手的过程,只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回到调用进程
Unix网络编程—基本UDP套接字编程