UDP协议是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
既然有了保证可靠传输的TCP协议,为什么还要非可靠传输的UDP协议呢?主要的原因有两个。一是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。二是在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
服务器端程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define N 256
int main(int argc, char *argv[])
{
// 0定义变量
int serverfd;
int nbytes; //获取接收到数据字节数
struct sockaddr_in serveraddr, clientaddr;
char buf[N];
int addrlen = sizeof(struct sockaddr_in);
if(argc < 3){
puts("server
return -1;
}
// 1创建UDP套接字--socket
serverfd = socket(AF_INET, SOCK_DGRAM, 0);
if(serverfd < 0){
perror("socket err");
return -1;
}
// 2定义套接字地址--sockaddr_in
bzero(&serveraddr, addrlen);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
// 3绑定套接字--bind
if(bind(serverfd, (struct sockaddr*)&serveraddr, addrlen) < 0){
perror("bind err");
return -1;
}
while (1) {
// 4接受来自客户端消息 recvfrom
recvfrom(serverfd, buf, N, 0, (struct sockaddr*)&clientaddr, &addrlen);
printf("recv data = %s\n", buf);
// 5回发给客户端 sendto
sendto(serverfd, "hello", 6, 0, (struct sockaddr*)&clientaddr, addrlen);
}
// 6关闭套接字--close
close(serverfd);
}
客户端程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define N 256
int main(int argc, char *argv[])
{
// 0定义变量
int clientfd;
struct sockaddr_in serveraddr;
char buf[N] = {0};
int addrlen = sizeof(struct sockaddr_in);
if(argc < 3){
puts("client
return -1;
}
// 1创建UDP套接字--socket
clientfd = socket(AF_INET, SOCK_DGRAM, 0);
if(clientfd < 0){
perror("socket err");
return -1;
}
// 2指定服务器地址--sockaddr_in
bzero(&serveraddr, addrlen);
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
while (1) {
// 3发送消息给服务器 sendto
gets(buf);
sendto(clientfd, buf, N, 0, (struct sockaddr*)&serveraddr, addrlen);
// 4接收服务器的消息 recvfrom
recvfrom(clientfd, buf, N, 0, (struct sockaddr*)&serveraddr, &addrlen);
printf("%s\n", buf);
}
// 5关闭套接字--close
close(clientfd);
}
Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5,京公海网安备11010802025203号