网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

使用 UDP 协议的客户端-服务器通信方式 | C 语言实现

更新时间:2026年03月27日   作者:spoto   标签(Tag):

UDP是一种无连接协议。在UDP中,客户端和服务器之间不会建立任何连接。与TCP不同,UDP中的客户端不会主动建立连接,而是直接发送数据报。同样,服务器也不会接受任何连接请求,它只是等待来自客户端的数据报的到来而已。

虽然如此connect()该函数可以与 UDP 一起使用,它不会像 TCP 那样进行三次握手。相反,它只是为套接字分配一个默认的对方地址(包括 IP 地址和端口)。调用之后……connect()该应用程序可以使用send()还有recv()而不是sendto()以及recvfrom().

.

必要的功能:

int connect(int sockfd, const struct sockaddr *servaddr,
socklen_t addrlen);
返回值:如果操作成功,则返回 0;如果出现错误,则返回 -1。
论点/论据:
sockfd要连接的套接字的文件描述符。
struct sockaddr *servaddr服务器地址结构。
地址长度服务器地址结构的长度。

以下是实现服务器与客户端之间消息传递的代码示例:

UDP服务器代码:

C
// 用于实现UDP连接的服务器程序#include<stdio.h>#include<strings.h>#include<sys/types.h>#include<arpa/inet.h>#include<sys/socket.h>#include<netinet/in.h>#define PORT 5000定义 MAXLINE 为 1000// 驱动程序代码整数主要/核心(){字符/字母缓冲区[100];字符/字母*信息/消息=“您好,客户。”;整数listenfd,长度;结构体sockaddr_inservaddr,cliaddr;bzero(&servaddr,sizeof(servaddr));// 创建一个UDP套接字listenfd=插座(AF_INET,SOCK_DGRAM,0);servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(港口);servaddr.sin_family=AF_INET;// 将服务器地址绑定到套接字描述符上绑定(listenfd,(结构体sockaddr*)&servaddr,sizeof(servaddr));//接收数据报长度=sizeof(cliaddr);整数n=接收数据(listenfd,缓冲区,sizeof(缓冲区),0,(结构体sockaddr*)&cliaddr,&长度);//从服务器接收消息缓冲区[n]='\0';放置/安置(缓冲区);// 发送响应发送到(listenfd,信息/消息,strlen(消息/信息),0,(结构体sockaddr*)&cliaddr,sizeof(cliaddr));}

UDP客户端代码:

C
// UDP客户端驱动程序程序#include<stdio.h>#include<strings.h>#include<sys/types.h>#include<arpa/inet.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>#include<stdlib.h>#define PORT 5000定义 MAXLINE 为 1000// 驱动程序代码整数主要/核心(){字符/字母缓冲区[100];字符/字母*消息=“你好,服务器”;整数sockfd,n;结构体sockaddr_inservaddr;// 清除 servaddr 变量的值bzero(&servaddr,sizeof(servaddr));servaddr.sin_addr.s_addr=inet_addr(127.0.0.1);servaddr.sin_port=htons(港口);servaddr.sin_family=AF_INET;// 创建数据报套接字sockfd=插座(AF_INET,SOCK_DGRAM,0);// 连接到服务器if(连接(sockfd,(结构体sockaddr*)&servaddr,sizeof(servaddr))<0){printf("\n错误:连接失败。\n");退出/离开(0);}// 请求发送数据报// 在 sendto 函数中,无需指定服务器地址。// connect 存储着各个对等节点的IP地址和端口号。发送到(sockfd,信息/消息,MAXLINE,0,(结构体sockaddr*)空值,sizeof(servaddr));// 等待响应接收数据(sockfd,缓冲区,sizeof(缓冲区),0,(结构体sockaddr*)空值,空值);放置/安置(缓冲区);// 关闭描述符关闭(sockfd);}

输出结果:

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

上一篇: EIGRP基础知识

下一篇: EIGRP成本计算

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料