6.1 理解UDP
UDP套接字的特点
跟寄信一样,我写好名字和地址,贴上邮票寄出去就好了。
邮寄过程的丢失或者损坏我都没办法保证,是一种不可靠的传输方式。但相比TCP,虽然可靠性差一些,但比TCP简洁一些,速度也更快一些(在每次交换的数据量越小的情况下)。。
TCP和UDP的差异只在于流控制机制:TCP在不可靠的IP层进行流控制,而UDP缺少这种流控制机制。
6.2 实现基于UDP的服务器端/客户端
UDP中的服务器端和客户端没有连接
与TCP不同,无需经过连接过程即可交换数据
(UDP中只有创建套接字过程和数据交换过程)
UDP服务器端和客户端都只需1个套接字
TCP中,套接字之间是1对1的关系。若要向10个客户端提供服务,除了守门的服务器套接字外,还需要10个服务器端套接字
把邮筒比作套接字,只要附近有1个邮筒,就能通过它向任意地址寄出信件。
也就是说,只要1个UDP套接字就能向任意主机传输数据。
基于UDP的数据IO函数
创建好TCP套接字后,传输数据时就不用再添加地址信息。因为TCP套接字将保持与对方套接字的连接。
但UDP套接字不会保持连接状态,因此每次传输数据都需要添加目标地址信息(相当于寄信前在信件中填地址)。
可以看到,sendto函数与TCP输出函数的最大区别在于,此函数需要向它传递目标地址信息。
上述就是UDP程序最核心的部分。
基于UDP的回声服务器端/客户端
UDP不同于TCP,不存在请求连接和受理过程,因此在某种意义上没办法去明确区分服务器端和客户端。
1)服务器端
// uecho_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char *message);
int main(int argc, char *argv[]){
int serv_sock;
char message[BUF_SIZE];
int str_len;
struct sockaddr_in serv_adr;
struct sockaddr_in clnt_adr;
socklen_t clnt_addr_sz;
if(argc != 2){
printf