无连接通信是通过UDP(User Datagram Protocol)/IP(Internet Protocol)协议来完成的,它不能确保可靠的数据传输,但能将数据发送到多个目标,或者接收多个源数据。相较于TCP等连接通信,无连接通信只要服务端先用socket()创建套接字,然后通过bind()绑定指定端口,不必调用listen()、accept(),只需要等待数据即可。
UDP使用场景:1.网络数据大多是短消息;2.拥有大量的client;3.对数据安全性无特殊要求(当报文发送之后,是无法得知其是否安全完整到达的);4.网络负担非常重,但对响应速度要求高。应用在比如:网络视频会议系统的C/S网络应用。
客户端程序流程
step1 初始化Socket库
step2 创建套接字
SOCKET sClient = socket(AF_INET, SOCK_DGRAM, 0);
step3 填写服务器地址
sockaddr_in server;
memset(&server, 0, sizeof(sockaddr_in));
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(argv[1]);
server.sin_port = htons((u_short)atoi(argv[2]));
step4 与服务器通信(数据通讯),进行信息处理
(发送数据)
char buff[512] = {0};
strcpy(buff, "I am client");
int nRet = sendto(sClient, buff, strlen(buff)+1, 0, (struct sockaddr*)&server, sizeof(server));
(接收数据)
char buff[512];
int nAddrLen = sizeof(server);
memset(buff, 0, sizeof(buff));
nRet = recvfrom(sClient, buff, sizeof(buff), 0, (struct sockaddr*)&server, &nAddrLen);
step5 通信结束后关闭套接字
step6 卸载Socket库
服务器端程序流程
step1 初始化Socket库
step2 创建套接字
SOCKET sListen= socket(AF_INET,SOCK_DGRAM,0)
step3 创建本地实体,填写本机地址信息
sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons((u_short)8888);
step4 绑定一个固定的端口
bind(sListen, (struct sockaddr *)&local, sizeof(local));
step5 接收客户端的数据报,进行处理与通信
接收数据
struct sockaddr_in from;
memset(&from, 0, sizeof(from));
int fromLen = sizeof(from);
char buff[512] = {0};
recvfrom(sListen,buff, sizeof(buff), 0, (struct sockaddr*)&from, &fromLen);
发送数据
char buff[512] = {0};
strcpy(buff, "I am server");
sendto(sListen, buff, strlen(buff+1), 0, (struct sockaddr*)&from, fromLen);
step6 通信结束后关闭套接字
closesocket(sListen);
step7 卸载Socket库