socket实验报告

时间: 2023-06-29 08:08:03 浏览: 49
实验名称:使用socket实现TCP/IP通信 实验目的:通过本次实验,掌握socket编程的基本知识,了解TCP/IP通信的原理和实现方式。 实验环境:Ubuntu 18.04 实验步骤: 1. 编写服务器端程序 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 12345 int main(void) { int server_sockfd, client_sockfd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len; char buf[1024]; if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } if (listen(server_sockfd, 5) == -1) { perror("listen"); exit(EXIT_FAILURE); } printf("server is listening...\n"); client_addr_len = sizeof(client_addr); if ((client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_addr_len)) == -1) { perror("accept"); exit(EXIT_FAILURE); } printf("client %s is connected\n", inet_ntoa(client_addr.sin_addr)); while (1) { memset(buf, 0, sizeof(buf)); if (recv(client_sockfd, buf, sizeof(buf), 0) == -1) { perror("recv"); exit(EXIT_FAILURE); } printf("recv data: %s\n", buf); if (send(client_sockfd, buf, sizeof(buf), 0) == -1) { perror("send"); exit(EXIT_FAILURE); } } close(client_sockfd); close(server_sockfd); return 0; } ``` 2. 编译服务器端程序 ``` $ gcc server.c -o server ``` 3. 运行服务器端程序 ``` $ ./server ``` 4. 编写客户端程序 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 12345 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in server_addr; char buf[1024]; if (argc != 2) { fprintf(stderr, "usage: %s <ip_address>\n", argv[0]); exit(EXIT_FAILURE); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = inet_addr(argv[1]); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); exit(EXIT_FAILURE); } printf("connected to server %s\n", inet_ntoa(server_addr.sin_addr)); while (1) { printf("input data: "); fgets(buf, sizeof(buf), stdin); if (send(sockfd, buf, sizeof(buf), 0) == -1) { perror("send"); exit(EXIT_FAILURE); } memset(buf, 0, sizeof(buf)); if (recv(sockfd, buf, sizeof(buf), 0) == -1) { perror("recv"); exit(EXIT_FAILURE); } printf("recv data: %s\n", buf); } close(sockfd); return 0; } ``` 5. 编译客户端程序 ``` $ gcc client.c -o client ``` 6. 运行客户端程序 ``` $ ./client 127.0.0.1 ``` 实验结果: 在客户端输入数据后,服务端能够接收到数据并输出,同时将数据原封不动地发送回客户端。客户端接收到服务端发送的数据后,也能够正确输出。说明TCP/IP通信已经成功建立。 实验总结: 本次实验通过socket编程,实现了TCP/IP通信。socket编程是网络编程的基础,掌握socket编程的基本知识对于理解网络编程非常重要。通过本次实验,我不仅深入了解了TCP/IP通信的原理和实现方式,还锻炼了代码编写能力。

相关推荐

最新推荐

recommend-type

华中科技大学 计算机网络实验报告.docx

华中科技大学 计算机网络 实验报告 三次 socket tcp cpt组网华中科技大学 计算机网络 实验报告 三次 socket tcp cpt组网华中科技大学 计算机网络 实验报告 三次 socket tcp cpt组网华中科技大学 计算机网络 实验报告...
recommend-type

Android系统应用开发 实验五 网络通信 实验报告

实验目的: 1、 了解Android网络通信技术 2、 掌握在程序中嵌入浏览器的方法 3、掌握HTTP通信 4、掌握Socket通信 实验内容:(其中,1必做,2和3选一个) 1、 开发一个简单的浏览器程序,实现网址输入、前进、后退、...
recommend-type

计算机网络实验报告 获取MAC socket通信

java.net.Socket sk = new java.net.Socket("192.168.1.101",9000); java.io.InputStream is = new java.io.DataInputStream( sk.getInputStream()); // 接受网络输入流 写入文件 int len = 0; byte[] ...
recommend-type

网络编程实验报告——基于socket聊天系统、delphi的系统报告

网络编程实验报告——基于socket聊天系统、delphi的系统报告,实现局域网聊天的报告
recommend-type

实验报告模版_实验2.doc

计算机网络实验报告 一、 实验目的 深入掌握HTTP协议规范,学习如何编写标准的互联网应用服务器。 二、 实验内容  服务程序能够正确解析HTTP协议,并传回所需的网页文件和图片文件  使用标准的浏览器,如IE、...
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

hive中 的Metastore

Hive中的Metastore是一个关键的组件,它用于存储和管理Hive中的元数据。这些元数据包括表名、列名、表的数据类型、分区信息、表的存储位置等信息。Hive的查询和分析都需要Metastore来管理和访问这些元数据。 Metastore可以使用不同的后端存储来存储元数据,例如MySQL、PostgreSQL、Oracle等关系型数据库,或者Hadoop分布式文件系统中的HDFS。Metastore还提供了API,使得开发人员可以通过编程方式访问元数据。 Metastore的另一个重要功能是跟踪表的版本和历史。当用户对表进行更改时,Metastore会记录这些更改,并且可以让用户回滚到
recommend-type

JSBSim Reference Manual

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