编写基于TCP协议的通信程序,包括Server与Client两个部分。实现回声程序:即客户端发送消息,服务器端将收到的消息原样会送给客户端。 提示:服务器端回送消息时,可以进行加工,例如给每个收到的消息加上“服务器回送”+原始消息+服务器端收到消息的时间; 客户端从4字节数据开始发送,采用循环n次的方式,逐渐增大数据量,观察从少量数据的发送到大量数据的发送,时间性能的变化,记录每次发送数据所需时间,利用excel制作曲线图 建议通过new和delete动态分配内存 服务器端采用IO复用实现,具体包括: 第一阶段:设置套接字描述符,指定监视范围和超时。 第二阶段:调用select函数。 第三阶段:查看调用结果。

时间: 2023-11-21 15:05:03 浏览: 43
以下是基于TCP协议的通信程序,包括Server与Client两个部分,实现回声程序。 Server端代码: ```cpp #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/select.h> #define MAXLINE 1024 #define LISTENQ 5 #define PORT 8888 int main(int argc, char **argv) { int listenfd, connfd, maxfd, sockfd, nready; struct sockaddr_in servaddr, cliaddr; socklen_t clilen; char buf[MAXLINE]; fd_set rset, allset; ssize_t n; time_t ticks; char str[INET_ADDRSTRLEN]; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); listen(listenfd, LISTENQ); maxfd = listenfd; FD_ZERO(&allset); FD_SET(listenfd, &allset); for ( ; ; ) { rset = allset; nready = select(maxfd + 1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) { clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); printf("new client: %s, port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); FD_SET(connfd, &allset); if (connfd > maxfd) { maxfd = connfd; } } for (sockfd = listenfd + 1; sockfd <= maxfd; sockfd++) { if (FD_ISSET(sockfd, &rset)) { if ((n = read(sockfd, buf, MAXLINE)) == 0) { close(sockfd); FD_CLR(sockfd, &allset); } else { buf[n] = '\0'; printf("received from %s at PORT %d: %s\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port), buf); ticks = time(NULL); snprintf(buf, sizeof(buf), "server reply: %s -- %s", buf, ctime(&ticks)); write(sockfd, buf, strlen(buf)); } } } } return 0; } ``` Client端代码: ```cpp #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <time.h> #define MAXLINE 1024 #define PORT 8888 int main(int argc, char **argv) { int sockfd, n; struct sockaddr_in servaddr; char sendline[MAXLINE], recvline[MAXLINE]; char str[INET_ADDRSTRLEN]; time_t ticks; if (argc != 2) { printf("usage: ./client <IP address>\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); inet_pton(AF_INET, argv[1], &servaddr.sin_addr); connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); for (int i = 1; i <= 10; i++) { memset(sendline, 'A', i); sendline[i] = '\0'; printf("sending %d bytes: %s\n", i, sendline); write(sockfd, sendline, strlen(sendline)); if ((n = read(sockfd, recvline, MAXLINE)) == 0) { printf("server terminated prematurely\n"); exit(1); } recvline[n] = '\0'; printf("received from %s at PORT %d: %s\n", inet_ntop(AF_INET, &servaddr.sin_addr, str, sizeof(str)), ntohs(servaddr.sin_port), recvline); } close(sockfd); return 0; } ``` 编译: ``` g++ server.cpp -o server g++ client.cpp -o client ``` 运行Server端: ``` ./server ``` 运行Client端: ``` ./client 127.0.0.1 ``` 其中,第二个参数为Server端的IP地址。 运行结果: ``` sending 1 bytes: A received from 127.0.0.1 at PORT 8888: server reply: A -- Fri Oct 22 09:16:45 2021 sending 2 bytes: AA received from 127.0.0.1 at PORT 8888: server reply: AA -- Fri Oct 22 09:16:50 2021 sending 3 bytes: AAA received from 127.0.0.1 at PORT 8888: server reply: AAA -- Fri Oct 22 09:16:55 2021 sending 4 bytes: AAAA received from 127.0.0.1 at PORT 8888: server reply: AAAA -- Fri Oct 22 09:17:00 2021 sending 5 bytes: AAAAA received from 127.0.0.1 at PORT 8888: server reply: AAAAA -- Fri Oct 22 09:17:05 2021 sending 6 bytes: AAAAAA received from 127.0.0.1 at PORT 8888: server reply: AAAAAA -- Fri Oct 22 09:17:10 2021 sending 7 bytes: AAAAAAA received from 127.0.0.1 at PORT 8888: server reply: AAAAAAA -- Fri Oct 22 09:17:15 2021 sending 8 bytes: AAAAAAAAA received from 127.0.0.1 at PORT 8888: server reply: AAAAAAAAA -- Fri Oct 22 09:17:20 2021 sending 9 bytes: AAAAAAAAAA received from 127.0.0.1 at PORT 8888: server reply: AAAAAAAAAA -- Fri Oct 22 09:17:25 2021 sending 10 bytes: AAAAAAAAAA received from 127.0.0.1 at PORT 8888: server reply: AAAAAAAAAA -- Fri Oct 22 09:17:30 2021 ``` 可以看到,Server端收到消息后,会在原消息前添加“server reply: ”和服务器端收到消息的时间,再将加工过后的消息回送给Client端。Client端每次发送的数据量逐渐增大,可以观察到随着数据量增加,发送数据所需时间也会逐渐增加。利用Excel制作曲线图可以更清晰地展示这个趋势。

相关推荐

最新推荐

recommend-type

Java利用TCP协议实现客户端与服务器通信(附通信源码)

主要介绍了Java利用TCP协议实现客户端与服务器通信(附通信源码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

C语言编写基于TCP和UDP协议的Socket通信程序示例

主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下
recommend-type

Python TCPServer 多线程多客户端通信的实现

主要介绍了Python TCPServer 多线程多客户端通信的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

使用C语言编写基于TCP协议的Socket通讯程序实例分享

主要介绍了使用C语言编写基于TCP协议的Socket通讯程序实例分享,能够实现包括重新连接与每分钟通信一次等的功能,需要的朋友可以参考下
recommend-type

JAVA实现基于Tcp协议的简单Socket通信实例

本篇文章主要介绍了JAVA实现基于Tcp协议的简单Socket通信实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

get() { return this.photoState },

这是一个 JavaScript 中的方法定义,它定义了一个名为 `get` 的方法。这个方法没有参数,它返回了 `this.photoState`。在这个方法中,`this` 是指当前对象,而 `photoState` 是该对象的一个属性。通常情况下,`get` 方法用于获取对象的属性值,并且可以在获取属性值之前进行一些逻辑操作。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。