讲师博文
udp编程步骤详解,就是如此的简单 来源 : 未知     2018-07-19

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);

}

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:activity工作流,这里让你快速了解

下一篇:lseek()函数的原型及使用方法,超详细

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号