C++网络编程——实现一个简单的echo服务器

在前面讲完了服务器从建立套接字、绑定、监听和提取,以及客户端的连接,我们已经可以动手实现一个简单的镜像服务器。

错误处理

在那之前,我们先封装一个错误处理函数 errif

可以定义一个uitl.cpp放里面,需要的地方引用即可

util.h

#ifndef UTIL_H
#define UTIL_H
​
void errif(bool, const char*);
​
#endif

util.cpp

#include "util.h"
#include <stdio.h>
#include <stdlib.h>
​
void errif(bool condition, const char *errmsg){if(condition){perror(errmsg);exit(EXIT_FAILURE);}
}

服务端代码

server.cpp

#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include "util.h"
​
int main(){int socketfd = socket(AF_INET,SOCK_STREAM,0);errif(sockfd == -1 "socket crete error");struct sockaddr_in serv_addr;bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(8888);errif(bind(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) == -1,"socket bind error");errif(listen(sockfd,SOMAXCONN) == -1,"socket listen error");struct sockaddr_in clnt_addr;socklen_t clnt_addr_len = sizeof(clnt_addr);bzero(&clnt_addr,sizeof(clnt_addr));int clnt_sockfd = accept(sockfd,(sockaddr*)&clnt_addr,&clnt_addr_len);errif(clnt_sockfd == -1,"socket accept error");printf("new client fd %d! IP:%s Port:%d\n",clnt_sockfd,inet_ntoa(clnt_addr.sin_addr),ntohs(clnt_addr.sin_port));//读写while (true) {char buf[1024];bzero(&buf,sizeof(buf));ssize_t read_bytes = read(clnt_sockfd,buf,sizeof(buf));if(read_bytes > 0){printf("message from client fd %d:%s",clnt_sockfd,buf);write(clnt_sockfd,buf,sizeof(buf));}else if(read_bytes == 0){printf("client fd %d disconnected\n",clnt_sockfd);close(clnt_sockfd);break;}else{close(clnt_sockfd);errif(true,"socket read error");}}close(sockfd);return 0;
}

客户端代码

client.cpp

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include "util.h"
​
int main(){int sockfd = socket(AF_INET,SOCK_STREAM,0);errif(sockfd == -1 "socket create error");struct sockaddr_in serv_addr;bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(8888);errif(connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) == -1,"socket connect error");while(true){char buf[1024];bzero(&buf,sizeof(buf));scanf("%s",buf);ssize_t write_bytes = write(sockfd,buf,sizeof(buf));if(write_bytes == -1){printf("socket already disconnected, can't write any more!\n");break;}bzero(&buf,sizeof(buf));ssize_t read_bytes = read(sockfd,buf,sizeof(buf));if(read_bytes > 0){printf("message from server:%s",buf);}else if(read_bytes == 0){printf("server socket disconnected\n");break;}else{errif(true, "socket read error");break;}}close(sockfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯Web开发【大学组:国赛】2022年真题

1.分一分 如果给你一个数组&#xff0c;你能很快将它分割成指定长度的若干份吗&#xff1f; 1.1 题目问题 请在 js/index.js 文件中补全函数 splitArray 中的代码&#xff0c;最终返回按指定长度分割的数组。 具体要求如下&#xff1a; 将待分割的&#xff08;一维&#x…

云WAF如何适应动态变化的网络安全威胁

云WAF&#xff08;Web Application Firewall&#xff09;是一种专门用于保护Web应用程序的安全系统&#xff0c;它能够实时监测并分析网络流量&#xff0c;一旦发现潜在攻击行为立即进行阻断&#xff0c;有效防止各类Web应用层攻击。云WAF的适应性主要体现在以下几个方面&#…

【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.”解决方法

【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.” 一、Docker环境介绍2.1 本次环境介绍2.2 本次实践介绍二、故障现象2.1 运行容器消失2.2 重新运行容器报错三、故障分析四、故障处理4.1 停止 Docker 服务:4.2 备份重要数据4.3 清理冲突…

从了解到掌握 Spark 计算框架(一)Spark 简介与基础概念

文章目录 什么是 Spark&#xff1f;核心特点 Spark 对比 MapReduceSpark 编程模型RDDDataFrameDataset Spark 运行模式Spark 生态 什么是 Spark&#xff1f; Spark 是一个基于内存的分布式计算框架&#xff0c;最初由加州大学伯克利分校的 AMPLab 开发&#xff0c;后来捐赠给了…

go语言基准测试Benchmark 最佳实践-冒泡排序和快速排序算法基准测试时间复杂度对比

在go语言中Benchmark基准测试( 在后缀为_test.go的文件中&#xff0c;函数原型为 func BenchmarkXxx(b *testing.B) {}的函数 )可以用来帮助我们发现代码的性能和瓶颈&#xff0c; 其最佳实践 应该是我们最常用的 冒泡排序和快速排序的测试了&#xff0c;废话不说&#xff0c;直…

【MySQL精通之路】InnoDB(9)-表和页压缩(2)-页压缩

目录 1.支持的平台 2.页面压缩的工作原理 3.启用页面压缩 4.禁用页面压缩 5.页面压缩-元数据 6.使用页面压缩识别表 7.页面压缩限制和使用说明 InnoDB支持对驻留在FPT表空间中的表进行页面级压缩。 此功能被称为透明页面压缩。通过使用CREATE TABLE或ALTER TABLE指定COM…

项目9-网页聊天室3(主界面之用户信息)

1.前端页面 CSS: 如何让img里的图片自适应div&#xff0c;且不变形_img自适应div大小 铺满且不变形-CSDN博客 JavaScript/jQuery 如何改变一个img元素的src属性|极客教程 (geek-docs.com) 2.要求 左上角显示用户的昵称和头像. 3.后端代码 3.1 添加拦截器 3.2 注册拦截器 …

关于C++的类型转换一篇搞掂

类型转换 本篇主要探讨C11的新出现的类型转换方式 隐式类型转换(意义相近的类型可转换) 显示类型转换(意义不相近的类型需强制类型转换) C为了加强类型转换的可视性, 引入了四种命名强制类型转换操作符 但同时也兼容了C语言之前的类型转换和强制类型转换, 只是提供了规范的转…

go升级后 编译的exe在win7上无法正常运行

D:/Go/src/runtime/sys_windows_amd64.s:65 x75 fpx22fca sp-0x22fc8日 升级到go 1.21后报一堆错误&#xff0c;要死了啊 原来是go 1.21不支持win7了&#xff0c;必须把go退回到1.20版本 谷歌发布编程语言 Go 1.21 版本&#xff1a;取消支持微软 Win7/8 及苹果 macOS 10.13/10…

pip install pytorch-quantization error

一 报错信息 最近安装pytorch-quantization报错&#xff0c;安装失败报错信息如下&#xff1a; Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Collecting pytorch-quantizationDownloading pytorch-quantization-2.2.1.tar.gz (6.8 kB)Prepari…

Alibaba Cloud Linux 安装docker

阿里云实例基于 Red Hat 的发行版&#xff08;例如 CentOS 或 Alibaba Cloud Linux&#xff09;。在这种情况下&#xff0c;应该使用 yum 或 dnf 包管理器&#xff0c;而不是 apt。以下是如何在 CentOS 或类似系统上安装 Docker 的步骤&#xff1a; 1. 更新系统 首先&#xf…

网络渗透思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 windows的明文密码:是通过LSA&#xff08;Local Security Authority&#xff09;进行存储加密的 存储过程:当用户输入密码之…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

Vue3学习使用axios和qs进行POST请求和响应处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言1.准备工作2.发送POST请求3.处理响应数据4.总结 一、前言 在前端开发中&#xff0c;经常需要与后端进行数据交互&#xff0c;其中包括发送POST请求并处理响…

Docker - Kafka

博文目录 文章目录 说明命令 说明 Docker Hub - bitnami/kafka Docker Hub - apache/kafka Kafka QuickStart Kafka 目前没有官方镜像, 目前拉取次数最多的 bitnami/kafka, Apache 提供的是 apache/kafka, 本文使用 bitnami/kafka 数据卷数据卷印射在容器内的路径kafka/bitna…

HarmonyOS 鸿蒙应用开发 - 创建自定义组件

开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与UI分离&#xff0c;后续版本演进等因素。因此&#xff0c;将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。 1、创…

快团团帮卖团长怎么对供货大团长进行评分?

都说帮卖“躺赚”&#xff1f; 一旦遇团不淑&#xff0c;惨遭不靠谱团长挖坑&#xff0c;售后拖延、发货慢、产品瑕疵…… 加上顾客夺命连环催&#xff0c;双面夹击&#xff0c;夹缝生存。供货团长靠不靠谱太重要了&#xff01; 快团团供货团长评分系统上线&#xff01; 帮卖团…

【神经网络优化的策略有哪些???】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、神经网络优化策略总结 前言 神经网络优化是深度学习中至关重要的一部分&#xff0c;它涉及到调整神经网络参数以最小化损失函数。 以下是一些常见的神经网…

ECOLOGY9解决明细表数据按需显示或隐藏

ECOLOGY9:由于领导需要查看完整的明细表数据&#xff0c;没有启用分页功能&#xff0c;导致大领导查看时又出现几百行的数据&#xff0c;影响使用体验。需求&#xff1a;只看正常表单数据&#xff0c;明细表数据&#xff0c;默认不显示&#xff0c;需要查看时再打开。 实现&am…

2024年华为OD机试真题-火星文计算-C++-OD统一考试(C卷D卷)

题目描述: 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y = 4*x+3*y+2 x$y = 2*x+y+3 1、其中x、y是无符号整数 2、地球人公式按C语言规则计算 3、火星人公式中,#的优先级高于$,相同的运算符,按从左到右的顺序计算 现有一段火星人的字符串报文,请…