上一篇文章已经讨论了linux套接字基于TCP的客户端和服务器端编程,这片文章详细讨论linux套接字基于UDP的客户端和服务器端编程。
UDP客户端服务器模式
UDP与TCP相比要简洁很多,UDP不需要listen,accept和connect过程。
1. socket函数创建套接字
#include <sys/types.h>
#include <sys/socket.h>
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
UDP是数据报的形式,因此在创建套接字时,是SOCK_DGRAM,这是与TCP不同的地方。
2. bind函数,绑定服务器地址到套接字上
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind函数与TCP的使用相同,将服务器的知名端口号和IP地址绑定到服务器套接字地址上,IP地址可能有多个。
3. sendto函数,发送数据给指定地址
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
sendto函数比send函数多出两个参数,一个是目的地址,一个是地址长度。告诉客户端发送给哪个IP地址和哪个端口号。
3. recvfrom函数,接收数据
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
recvfrom函数比recv函数多出两个参数,相当于TCP的accept函数,告诉我们是谁发送了数据过来。
服务端程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>