UDP简介
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
UDP和TCP协议的区别:
-
1、连接方面区别
TCP面向对象连接(如打电话要先拨号建立连接)。
UDP是无连接的,即发送数据之前不需要建立连接。
-
2、安全方面的区别
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
UDP尽最大努力交付,即不保证可靠交付。安全系数低。
-
3、传输效率的区别
TCP传输效率相对较低。
UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。
-
4、连接对象数量的区别
TCP连接只能是点到点、一对一的。
UDP支持一对一,一对多,多对一和多对多的交互通信。
UDP服务端(Server)实现过程:
server.c:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
int main(int argc,char *argv[])
{
int port=8888;
int reuse=1;
int sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock < 0){
perror("socket error");
return 2;
}
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr = INADDR_ANY;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){
perror("bind error");
return 3;
}
int done = 0;
struct sockaddr_in peer;
socklen_t len = sizeof(peer);
char buf[1024];
while(!done){
memset(buf,'\0',sizeof(buf));
printf("Please Enter:");
recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&peer,&len);
printf("#########################\n");
printf("get a client,socket: %s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));
printf("client : %s ,echo client!\n",buf);
printf("#########################\n");
}
return 0;
}
客户端(client.c):
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
if(argc != 2){
printf("Please Enter: %s [ip] \n",argv[0]);
return 1;
}
int port=8888;
int sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock < 0){
perror("socket error");
return 2;
}
struct sockaddr_in remote;
remote.sin_family = AF_INET;
remote.sin_port = htons(port);
remote.sin_addr.s_addr = inet_addr(argv[1]);
int done = 0;
char buf[1024];
while(!done){
memset(buf,'\0',sizeof(buf));
printf("Please Enter:");
fflush(stdout);
ssize_t _s = read(0,buf,sizeof(buf)-1 );
sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&remote,sizeof(remote));
}
return 0;
}
编译服务端:
gcc server.c -o server
编译客户端:
gcc client.c -o client
运行服务端
./server
运行客户端
./client 127.0.0.1