文章目录
一、概述
使用UDP编写的一些常见的应用程序有:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)。
二、recvfrom和sendto函数
这两个函数类似于标准的read和write函数,不过需要三个额外的参数
#include <sys/socket.h>
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的三个参数,描述符、读写缓冲区指针、读写字节数
- flags14章介绍,当前总是设置为0
- recvfrom的from参数存放发送者的套接字地址结构,由函数返回时填写;sendto的to参数指向一个数据报接受者的协议地址的套接字结构。
- recvfrom的addrlen是指针,同样由函数返回给调用者;sendto中的addrlen是整数,指定地址结构的大小
recvfrom返回0是可以接受的,不像read返回0表示对端关闭连接。因为UDP是无连接的,也就没有所谓的关闭。
三、UDP回射服务器和客户端程序
3.1 服务端程序
#include "unp.h"
void dg_echo(int sockfd, SA* pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];
while(1){
len = clilen;
n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
Sendto(sockfd, mesg