当前位置: 首页 > news >正文

《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实现字符串对话 主要需求&#xff1a; 服务器端和客户端各传递 1 次字符串&#xff0c;基于 TCP 协议&#xff0c;传递字符串前先以 4 字节整数型方式传递字符串长度&#xff0c;剩余部分为字符串数据&#xff1b; 注&#xff1a;下面的代码基于 Windows 系统实现&am…...

Feign负载均衡写法

Feign主要为了面向接口编程 feign是web service客户端&#xff0c;是接口实现的&#xff0c;而ribbon是通过微服务名字访问通过RestTemplate调用的&#xff0c;如下&#xff1a; 在Feign的实现下&#xff0c;我们只需要创建一个接口并使用注解的方式来配置它&#xff08;类似…...

OpenCV(二十八):连通域分割

目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割 连通域分割是一种图像处理技术&#xff0c;用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性&#xff0c;如相近的灰度值或颜色。连通域分割可以…...

达梦控制台还原报错“管道失败”

达梦数据库控制台还原报错“管道失败” 环境 主机操作系统&#xff1a;windows10 profession 达梦数据库版本&#xff1a;达梦7 问题背景 全新安装达梦7数据库后&#xff0c;创建数据库实例&#xff0c;需要恢复往期bat备份。在控制台配置指定搜索目录后&#xff0c;获取备份时…...

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么&#xff1f;2、DMA介绍3、DMA 中的数据传输如何进行&#xff1f;4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式&#xff08;Burst Mode&#xff09;6.2 循环窃取模式…...

java八股文面试[设计模式]——23种设计模式

设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结 在GOF编写的设计模式(可复用面向对象软件的基础)一书中说道: 本书涉及的设计模式并不描述新的或未经证实的设计&#xff0c;我们只收录那些在不同系统中…...

mysql(十)mysql主从复制--主库切换

概述 可能为了更迭升级服务器&#xff0c;或者主库出现问题&#xff0c;又或者只是希望重新分配容量&#xff0c;此时需要切换主库。 如果这是计划内的切换&#xff0c;会相对容易点。只需要在从库上使用CHANGE MASTER TO命令&#xff0c;并设置合适的值。大多数的值都是可选…...

vue3项目的src下的各个文件夹介绍

在Vue 3项目中&#xff0c;通常的目录结构如下所示&#xff1a; src/|- assets/ # 存放静态资源文件&#xff0c;如图片、字体等|- components/ # 存放可复用的Vue组件|- views/ # 存放页面级别的Vue组件|- router/ # 存放路由相关的配置文件|- store…...

五、编译预处理

源程序编译预处理命令一律以‘#’开头 5.1宏定义 不带参数的宏定义 # define 宏名 字符串 宏命令之后&#xff0c;出现宏名的地方均用其对应的字符串来替换。 宏替换是一种”机械替换“&#xff0c;宏定义语句后一般不加分号&#xff0c;因为它仅具有替换功能&#xff0c;…...

应用出海,Google 分享如何让数字营销素材再上层楼

数字营销广告要想取得理想的效果&#xff0c;广告素材是最关键的决定因素之一。 事实上米贸搜谷歌推广发现&#xff0c;在广告给品牌带来的销售额增量中&#xff0c;有 47% 都归功于广告素材。在当今自动化时代&#xff0c;广告素材的作用尤其重要&#xff1a;固然机器可以完成…...

酱香咖啡喝了没?用数据分析揭秘瑞幸咖啡的7500万用户增长策略

瑞幸 X 茅台 这波联名赢麻了&#xff0c;不仅狂卖 542 万杯&#xff0c;甚至带动茅台市值飙升200亿。 瑞幸这几年联名搞了不少&#xff0c;又是线条小狗的爱情故事&#xff0c;又是椰树、维密、周大福、足球的&#xff0c;下面老李就从数据分析角度&#xff0c;带大家来看一下…...

Grafana之魔法:揭秘数据可视化的艺术

在数据驱动的时代&#xff0c;如何有效地呈现和理解数据成为了每个组织和个人的核心任务。Grafana作为一个领先的开源数据可视化工具&#xff0c;为我们提供了强大的功能和灵活性。本文将深入探讨Grafana的魔法&#xff0c;以及它如何帮助我们更好地理解数据。 Grafana简介 G…...

c高级day2作业

写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz…...

第3章 【MySQL】字符集和比较规则

3.1 字符集和比较规则简介 3.1.1 字符集简介 如何存储字符串&#xff1f;需要建立字符与二进制数据的映射关系。建立这个关系需要&#xff1a; 1.把哪些字符映射成二进制数据&#xff1f; 2.怎么映射&#xff1f; 将一个字符映射成一个二进制数据的过程也叫做 编码 &#…...

2023 年全国大学生数学建模D题目-圈养湖羊的空间利用率

D题目应该是专科题目&#xff1f;&#xff1f;&#xff1f;不确定了 感觉类似一个细胞分裂问题一样&#xff0c;1&#xff0c;2&#xff0c;4&#xff0c;8&#xff0c; 题目1中规中矩 按照前面说的分配方法&#xff0c;一步一步计算进行 缺口的问题考虑反推回去&#xff0c…...

攻防世界-WEB-ics-05

打开靶机 只有设备维护中心可以点开 点标签得到新的url pageindex 想到文件包含漏洞&#xff08;URL中出现path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼 利用php伪协议查看源码 出现一段base64源码&#xff0c;进行转码得出源码 ?pagephp://filter…...

typedef的四种用法

目录 前言 1&#xff09;为基本数据类型定义类型名 2&#xff09;为自定义数据类型&#xff08;结构体、枚举、共用体&#xff09;定义别名 3&#xff09;为数组定义简易的别名 4&#xff09;为指针定义简洁的名称 前言 在看工程的过程中发现typedef的如下用法&#xff0c…...

Rstudio开不开了怎么办?R is taking longer to start than usual

Rstudio Server 启动时卡死 在使用 linux 服务器版 RstudioServer 的过程中&#xff0c;发现出现了一个问题&#xff0c;导致没有办法正常载入工作页面&#xff0c;网页提示信息是“R is taking longer to start than usual”&#xff0c;直接翻译过来就是“这次启动 R 会比平…...

kubernetes 集群安装加载 br_netfilter 模块

kubernetes 集群安装加载 br_netfilter 模块 Linux 系统默认是禁止数据包转发功能。 加载系统参数&#xff1a; # sysctl -p /etc/sysctl.d/k8s.conf 错误提示&#xff1a; sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or director…...

CATIA Composer软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 CATIA&#xff08;Computer-Aided Three-dimensional Interactive Application&#xff09;是一款由法国达索系统公司开发的三维计算机辅助设计&#xff08;CAD&#xff09;软件。它是一种全面的产品开发解决方案&#xff0c;广泛…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...