《TCP/IP网络编程》--基于TCP实现字符串对话和文件传输
1--基于TCP实现字符串对话
主要需求:
服务器端和客户端各传递 1 次字符串,基于 TCP 协议,传递字符串前先以 4 字节整数型方式传递字符串长度,剩余部分为字符串数据;
注:下面的代码基于 Windows 系统实现;
1-1--服务器端
// gcc string_server_win.c -o string_server_win -lwsock32
// string_server_win 9190#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>#define BUF_SIZE 1024
#define Len_SIZE 4void ErrorHandling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[]){if (argc != 2) {printf("Usage: %s <port>\n", argv[0]);exit(1);}WSADATA wsaData; // init Socket libif(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){ ErrorHandling("WSAStartup() error!");}int Serv_sock = socket(PF_INET, SOCK_STREAM, 0); // create socketif (Serv_sock == -1) {ErrorHandling("socket() error");}struct sockaddr_in serv_addr; // allocate ip, portmemset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);serv_addr.sin_port = htons(atoi(argv[1]));if (bind(Serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1){ ErrorHandling("bind() error");}if (listen(Serv_sock, 5) == -1) { // readyErrorHandling("listen() error");}struct sockaddr_in clnt_addr;int clnt_addr_size = sizeof(clnt_addr);for (int i = 0; i < 5; ++i) {int Clnt_sock = accept(Serv_sock, (struct sockaddr*) &clnt_addr, &clnt_addr_size); // acceptif (Clnt_sock == -1){ErrorHandling("accept() error");}else{printf("Connected client %d \n", i+1);}while(1) {int over = 0, recv_len = 0, msg_len, recv_cnt;char msg[BUF_SIZE];while (recv_len == 0 || recv_len < msg_len + Len_SIZE) {recv_cnt = recv(Clnt_sock, (char*)&msg[recv_len], BUF_SIZE, 0);if (recv_cnt == -1) {ErrorHandling("read() error!");}if (recv_cnt == 0) {over = 1;break;}recv_len += recv_cnt;if (recv_len >= Len_SIZE) {memcpy(&msg_len, msg, Len_SIZE);}}msg[recv_len] = '\0';if (over == 1) {break;}printf("Message from client: %s", msg + Len_SIZE); // output message from clientfputs("Input message: ", stdout);fgets(msg + Len_SIZE, BUF_SIZE - Len_SIZE, stdin); // input messageint len = strlen(msg + Len_SIZE);memcpy(msg, &len, Len_SIZE);send(Clnt_sock, msg, Len_SIZE + len, 0); // send message to client}closesocket(Clnt_sock);}closesocket(Serv_sock);return 0;
}
1-2--客户端
// gcc string_client_win.c -o string_client_win -lwsock32
// string_client_win 127.0.0.1 9190#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>#define BUF_SIZE 1024
#define Len_SIZE 4void ErrorHandling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char* argv[]){if (argc != 3) {printf("Usage: %s <IP> <port>\n", argv[0]);exit(1);}WSADATA wsaData; // init socket libif(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){ErrorHandling("WSAStartup() error!");}int sock = socket(PF_INET, SOCK_STREAM, 0); // create socketif (sock == -1)ErrorHandling("socket() error");struct sockaddr_in serv_addr; // allocate ip, portmemset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr(argv[1]);serv_addr.sin_port = htons(atoi(argv[2]));if (connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1){ // connectErrorHandling("connect() error");}else {puts("Connected");}for(int i = 0; i < 3; i++) {char msg[BUF_SIZE];memset(msg, 0, BUF_SIZE);fputs("Input message: ", stdout);fgets(msg + Len_SIZE, BUF_SIZE - Len_SIZE, stdin); // input messageint len = strlen(msg + Len_SIZE);memcpy(msg, &len, Len_SIZE);send(sock, msg, Len_SIZE + len, 0); // send message to serverint recv_len = 0, msg_len = 0, recv_cnt = 0;while (recv_len == 0 || recv_len < msg_len + Len_SIZE) {recv_cnt = recv(sock, (char*)&msg, BUF_SIZE, 0);recv_len += recv_cnt;if (recv_len >= Len_SIZE) {memcpy(&msg_len, msg, Len_SIZE);}}msg[recv_len] = '\0';printf("Message from server: %s", msg + Len_SIZE);}closesocket(sock);return 0;
}
1-3--编译运行
# 服务器端
gcc string_server_win.c -o string_server_win -lwsock32
string_server_win 9190# 客户端
gcc string_client_win.c -o string_client_win -lwsock32
string_client_win 127.0.0.1 9190
1-4--基于 linux 实现
项目链接:Chapter5
2--基于TCP实现文件传输
相关文章:
《TCP/IP网络编程》--基于TCP实现字符串对话和文件传输
1--基于TCP实现字符串对话 主要需求: 服务器端和客户端各传递 1 次字符串,基于 TCP 协议,传递字符串前先以 4 字节整数型方式传递字符串长度,剩余部分为字符串数据; 注:下面的代码基于 Windows 系统实现&am…...
Feign负载均衡写法
Feign主要为了面向接口编程 feign是web service客户端,是接口实现的,而ribbon是通过微服务名字访问通过RestTemplate调用的,如下: 在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(类似…...
OpenCV(二十八):连通域分割
目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割 连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以…...
达梦控制台还原报错“管道失败”
达梦数据库控制台还原报错“管道失败” 环境 主机操作系统:windows10 profession 达梦数据库版本:达梦7 问题背景 全新安装达梦7数据库后,创建数据库实例,需要恢复往期bat备份。在控制台配置指定搜索目录后,获取备份时…...
[杂谈]-快速了解直接内存访问 (DMA)
快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么?2、DMA介绍3、DMA 中的数据传输如何进行?4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式(Burst Mode)6.2 循环窃取模式…...
java八股文面试[设计模式]——23种设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结 在GOF编写的设计模式(可复用面向对象软件的基础)一书中说道: 本书涉及的设计模式并不描述新的或未经证实的设计,我们只收录那些在不同系统中…...
mysql(十)mysql主从复制--主库切换
概述 可能为了更迭升级服务器,或者主库出现问题,又或者只是希望重新分配容量,此时需要切换主库。 如果这是计划内的切换,会相对容易点。只需要在从库上使用CHANGE MASTER TO命令,并设置合适的值。大多数的值都是可选…...
vue3项目的src下的各个文件夹介绍
在Vue 3项目中,通常的目录结构如下所示: src/|- assets/ # 存放静态资源文件,如图片、字体等|- components/ # 存放可复用的Vue组件|- views/ # 存放页面级别的Vue组件|- router/ # 存放路由相关的配置文件|- store…...
五、编译预处理
源程序编译预处理命令一律以‘#’开头 5.1宏定义 不带参数的宏定义 # define 宏名 字符串 宏命令之后,出现宏名的地方均用其对应的字符串来替换。 宏替换是一种”机械替换“,宏定义语句后一般不加分号,因为它仅具有替换功能,…...
应用出海,Google 分享如何让数字营销素材再上层楼
数字营销广告要想取得理想的效果,广告素材是最关键的决定因素之一。 事实上米贸搜谷歌推广发现,在广告给品牌带来的销售额增量中,有 47% 都归功于广告素材。在当今自动化时代,广告素材的作用尤其重要:固然机器可以完成…...
酱香咖啡喝了没?用数据分析揭秘瑞幸咖啡的7500万用户增长策略
瑞幸 X 茅台 这波联名赢麻了,不仅狂卖 542 万杯,甚至带动茅台市值飙升200亿。 瑞幸这几年联名搞了不少,又是线条小狗的爱情故事,又是椰树、维密、周大福、足球的,下面老李就从数据分析角度,带大家来看一下…...
Grafana之魔法:揭秘数据可视化的艺术
在数据驱动的时代,如何有效地呈现和理解数据成为了每个组织和个人的核心任务。Grafana作为一个领先的开源数据可视化工具,为我们提供了强大的功能和灵活性。本文将深入探讨Grafana的魔法,以及它如何帮助我们更好地理解数据。 Grafana简介 G…...
c高级day2作业
写一个1.sh脚本,将以下内容放到脚本中: 在家目录下创建目录文件,dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中, 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz…...
第3章 【MySQL】字符集和比较规则
3.1 字符集和比较规则简介 3.1.1 字符集简介 如何存储字符串?需要建立字符与二进制数据的映射关系。建立这个关系需要: 1.把哪些字符映射成二进制数据? 2.怎么映射? 将一个字符映射成一个二进制数据的过程也叫做 编码 &#…...
2023 年全国大学生数学建模D题目-圈养湖羊的空间利用率
D题目应该是专科题目???不确定了 感觉类似一个细胞分裂问题一样,1,2,4,8, 题目1中规中矩 按照前面说的分配方法,一步一步计算进行 缺口的问题考虑反推回去,…...
攻防世界-WEB-ics-05
打开靶机 只有设备维护中心可以点开 点标签得到新的url pageindex 想到文件包含漏洞(URL中出现path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼 利用php伪协议查看源码 出现一段base64源码,进行转码得出源码 ?pagephp://filter…...
typedef的四种用法
目录 前言 1)为基本数据类型定义类型名 2)为自定义数据类型(结构体、枚举、共用体)定义别名 3)为数组定义简易的别名 4)为指针定义简洁的名称 前言 在看工程的过程中发现typedef的如下用法,…...
Rstudio开不开了怎么办?R is taking longer to start than usual
Rstudio Server 启动时卡死 在使用 linux 服务器版 RstudioServer 的过程中,发现出现了一个问题,导致没有办法正常载入工作页面,网页提示信息是“R is taking longer to start than usual”,直接翻译过来就是“这次启动 R 会比平…...
kubernetes 集群安装加载 br_netfilter 模块
kubernetes 集群安装加载 br_netfilter 模块 Linux 系统默认是禁止数据包转发功能。 加载系统参数: # sysctl -p /etc/sysctl.d/k8s.conf 错误提示: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or director…...
CATIA Composer软件安装包分享(附安装教程)
目录 一、软件简介 二、软件下载 一、软件简介 CATIA(Computer-Aided Three-dimensional Interactive Application)是一款由法国达索系统公司开发的三维计算机辅助设计(CAD)软件。它是一种全面的产品开发解决方案,广泛…...
noice.nvim终极性能优化指南:让你的Neovim编辑器运行如飞
noice.nvim终极性能优化指南:让你的Neovim编辑器运行如飞 【免费下载链接】noice.nvim 💥 Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu. 项目地址: https://gitcode.com/gh_mirrors/no/noic…...
FlexASIO:打破专业音频门槛,让普通设备也能拥有专业级ASIO体验
FlexASIO:打破专业音频门槛,让普通设备也能拥有专业级ASIO体验 【免费下载链接】FlexASIO A flexible universal ASIO driver that uses the PortAudio sound I/O library. Supports WASAPI (shared and exclusive), KS, DirectSound and MME. 项目地址…...
忍者绘卷Z-Image Turbo新手避坑:3个技巧搞定负向提示词
忍者绘卷Z-Image Turbo新手避坑:3个技巧搞定负向提示词 1. 负向提示词在忍者绘卷中的特殊价值 在忍者绘卷Z-Image Turbo这个专为二次元/火影忍者风格优化的AI绘画工具中,负向提示词扮演着"封印术"般的角色。它不仅仅是简单的排除列表&#x…...
MagiskHide Props Config:设备属性管理的3大维度与安全检测绕过全指南
MagiskHide Props Config:设备属性管理的3大维度与安全检测绕过全指南 【免费下载链接】MagiskHidePropsConf This tool is now dead... 项目地址: https://gitcode.com/gh_mirrors/ma/MagiskHidePropsConf 一、价值定位:为什么每个root用户都需要…...
RVC与FunASR联动:中文语音识别+AI翻唱端到端流水线
RVC与FunASR联动:中文语音识别AI翻唱端到端流水线 1. 引言:当AI翻唱遇见语音识别 想象一下这个场景:你有一段喜欢的歌曲音频,想用自己的声音翻唱它,但苦于记不住歌词,或者原唱语速太快跟不上。传统的做法…...
告别双流!用Vision Transformer (ViT) 搭建单流目标跟踪器OSTrack,实测速度提升40%
单流目标跟踪新范式:ViT驱动的OSTrack实战解析 在计算机视觉领域,目标跟踪技术正经历着从传统双流架构向单流范式的革命性转变。当我们面对复杂场景中的实时跟踪需求时,传统方法的性能瓶颈日益凸显——特征提取与关系建模的割裂处理导致计算冗…...
Pixel Aurora Engine部署教程:Nginx反向代理+HTTPS配置像素AI服务公网访问
Pixel Aurora Engine部署教程:Nginx反向代理HTTPS配置像素AI服务公网访问 1. 项目介绍与准备 Pixel Aurora Engine是一款基于AI扩散模型的高端像素艺术生成工具,采用复古8-bit游戏风格界面设计。通过本教程,您将学会如何通过Nginx反向代理和…...
2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷3:文末附答案)
2026年全国青少年信息素养大赛算法应用主题赛(C赛项初赛模拟卷3:文末附答案) 一、单选题 在C中,以下哪个关键字用于定义一个整型变量? A. int B. float C. char D. double 一支商队从长安出发,每天行进80里…...
逆向工程实战:如何用dbcc解析第三方CAN协议(含自定义结构体改造技巧)
逆向工程实战:用dbcc深度解析非标CAN协议与结构体改造技巧 在汽车电子和工业控制领域,CAN总线协议逆向分析是一项极具挑战性的工作。面对没有文档说明的第三方设备或商用车辆黑盒协议,工程师常常需要从原始数据流中重建通信逻辑。本文将深入探…...
Kubernetes 环境下 SkyWalking 的高效部署与性能调优
1. Kubernetes 环境下的 SkyWalking 部署实战 第一次在 Kubernetes 上部署 SkyWalking 时,我踩了不少坑。记得当时为了调试一个存储配置问题,整整熬了两个通宵。现在回想起来,如果当时有人能给我一份详细的实战指南,至少能节省 80…...
