如同TCP通信一样, UDP套接字也有专门的发送和接收数据的函数对应. TCP是recv
和send
两个函数负责收发, UDP是通过recvfrom
和sendto
两个函数负责收发数据.
recvfrom和sendto函数
函数原型:
#include <sys/socket.h>
ssize_t recvform(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,
struct sockaddr* to, socklen_t addrlen);
函数前4个参数和recv
,send
一样. 唯一不一样的就是最后两个参数.
参数 :
-
sockfd : 套接字
-
buff : 发送数据
-
nbytes : 发送字节数
-
flags :
flags值 描述 MSG_OOB 发送或接收外来数据(紧急数据) MSG_DONTROUTE 绕过路由表查找 MSG_DONTWAIT 仅操作非阻塞 MSG_PEEK 窥看外来数据 MSG_WAITALL 等待达到nbytes字节数后才返回
recvfrom :
- from : 对端UDP套接字信息. (无连接状态如果需要回复则不应该为空)
- addrlen : 对端UDP套接字大小. (注意 : addrlen 是指针)
sendto :
- to : 对端UDP套接字信息. (无连接状态如果需要发送不应该为空)
- addrlen : 发送的UDP套接字大小.
写一个长度为0的数据报也是可行的, 这样只发送8字节头部, recvfrom和sendto返回0也是可行的.
通信实现
UDP通信其实并不分客服端和服务端, 不过为了区分一般将发送方称为客服端, 接收方称为服务端.
服务端 : 因为UDP是无连接的, 所以服务端不需要listen
进行监听, 也不需要accept
.
服务端完整代码 : service.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#