失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > UDP实现服务器通信

UDP实现服务器通信

时间:2021-03-15 04:54:54

相关推荐

UDP实现服务器通信

UDP实现服务器通信

UDP协议UDP协议简介TCP/UDP优缺点通信流程recvfrom函数sendto函数UDP实现客户端服务端通信服务端程序客户端程序运行结果参考

UDP协议

UDP协议简介

UDP协议提供了一种面向无连接模式的通信。由于这种特性,使用UDP协议进行传输时的开销更小,但同时并不能保证被传输的数据能够到达目的地。UDP建立通信连接不需要借助三次握手和四次挥手,也就意味着TCP建立连接的accept函数和connect函数将不会被用到。

TCP/UDP优缺点

通信流程

step1:调用socket函数建立套接字, sockfd = socket(AF_INET, SOCK_DGRAM, 0),这里SOCK_DGRAM表示数据报套接字传输,而在TCP协议中采用SOCK_STREAM,表示流套接字传输。

step2:调用bind函数绑定地址结构,绑定服务端的IP地址和端口号。

step3:调用listen函数设置监听上限(可有可无)

step4:循环读取客户端数据,调用recvfrom函数,进行大小写转换,将读取到的数据发送回客户端。

step5:调用close函数关闭连接。

recvfrom函数

【recv函数、send函数只能用于TCP通信】

函数原型: ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

参数:

​sockfd:套接字

buf:缓冲区地址

len:缓冲区大小

flags:0-

src_addr:(struct sockaddr *)&addr,传出参数,对端地址结构

addrlen:传入传出参数

返回值:

成功:成功接收的数据字节数

失败:-1:errno 0:对端关闭

sendto函数

函数原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

参数:

sockfd:套接字

buf:存储数据的缓冲区

len:数据长度

flags:0-

src_addr:(struct sockaddr *)&addr,传出参数,目标地址结构

addrlen:地址结构长度

返回值:

成功:成功写出的数据字节数

失败:-1:errno

UDP实现客户端服务端通信

服务端程序

#include <string.h>#include <stdio.h>#include <unistd.h>#include <arpa/inet.h>#include <ctype.h>#define SERV_PORT 8000int main(void){struct sockaddr_in serv_addr, clie_addr;socklen_t clie_addr_len;int sockfd;char buf[BUFSIZ];char str[INET_ADDRSTRLEN];int i, n;sockfd = socket(AF_INET, SOCK_DGRAM, 0);bzero(&serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);serv_addr.sin_port = htons(SERV_PORT);bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));printf("Accepting connections ...\n");while (1) {clie_addr_len = sizeof(clie_addr);n = recvfrom(sockfd, buf, BUFSIZ,0, (struct sockaddr *)&clie_addr, &clie_addr_len);if (n == -1)perror("recvfrom error");printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &clie_addr.sin_addr, str, sizeof(str)),ntohs(clie_addr.sin_port));for (i = 0; i < n; i++)buf[i] = toupper(buf[i]);n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&clie_addr, sizeof(clie_addr));if (n == -1)perror("sendto error");}close(sockfd);return 0;}

客户端程序

#include <stdio.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <ctype.h>#define SERV_PORT 8000int main(int argc, char *argv[]){struct sockaddr_in servaddr;int sockfd, n;char buf[BUFSIZ];sockfd = socket(AF_INET, SOCK_DGRAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);servaddr.sin_port = htons(SERV_PORT);while (fgets(buf, BUFSIZ, stdin) != NULL) {n = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));if (n == -1)perror("sendto error");n = recvfrom(sockfd, buf, BUFSIZ, 0, NULL, 0); //NULL:不关心对端信息if (n == -1)perror("recvfrom error");write(STDOUT_FILENO, buf, n);}close(sockfd);return 0;}

运行结果

服务端:

客户端1:

客户端2:

参考

/fanle93/article/details/90666484

如果觉得《UDP实现服务器通信》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。