C++适配windows和linux下网络编程TCP简单案例

C++网络编程

网络协议是计算机网络中通信双方必须遵循的一套规则和约定,用于实现数据的传输、处理和控制。这些规则包括了数据格式、数据交换顺序、数据处理方式、错误检测和纠正等。网络协议是使不同类型的计算机和网络设备能够相互通信的基础,是网络通信的基石。

常见的网络协议:

  1. TCP/IP协议:TCP/IP(Transmission Control Protocol/Internet Protocol)协议是互联网的基础协议,包括了TCP(传输控制协议)和IP(互联网协议)等。TCP/IP协议族定义了网络中数据传输的规则,包括了数据包的封装、路由选择、数据传输、错误检测和校正等。

  2. HTTP协议:超文本传输协议(Hypertext Transfer Protocol)用于从万维网服务器传输超文本到本地浏览器的传输协议。HTTP协议是基于TCP/IP协议的,用于在浏览器和Web服务器之间进行通信。

  3. HTTPS协议:安全超文本传输协议(Hypertext Transfer Protocol Secure),是在HTTP的基础上加入了SSL/TLS协议,用于提供加密和身份验证的网络协议。HTTPS协议确保了数据在传输过程中的安全性和完整性。

  4. FTP协议:文件传输协议(File Transfer Protocol)用于在计算机之间传输文件。FTP协议允许用户从远程服务器下载文件或向远程服务器上传文件。

  5. SMTP协议:简单邮件传输协议(Simple Mail Transfer Protocol)用于在电子邮件服务器之间传输邮件。SMTP协议定义了邮件服务器如何发送和接收邮件的标准。

  6. DHCP协议:动态主机配置协议(Dynamic Host Configuration Protocol)用于自动分配IP地址、子网掩码、默认网关等信息给网络设备,简化了网络设备的配置过程。

  7. DNS协议:域名系统(Domain Name System)协议用于将域名转换为IP地址,使得用户可以通过易于记忆的域名访问网络资源,而不是直接使用IP地址。

协议的作用:

  • 数据传输:确保数据能够从发送方正确传输到接收方。
  • 错误检测与纠正:通过校验和、CRC(循环冗余校验)等机制检测数据传输过程中的错误,并尝试纠正这些错误。
  • 资源管理:控制网络资源的使用,如带宽分配、优先级设置等。
  • 安全性:通过加密、认证、授权等机制保护数据传输的安全性。
  • 兼容性:确保不同类型的设备和系统能够相互通信,实现互操作性。

网络协议的复杂性体现在它们需要在高效性、可靠性和安全性之间找到平衡,同时还要考虑到不同设备和应用的具体需求。随着技术的发展,新的网络协议不断涌现,以满足日益增长的网络通信需求。

1、windwos和linux代码案例

Service.cpp

#include <iostream>
#include <string>#ifdef __linux__
// Linux平台相关代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#elif defined(_WIN32)
// Windows平台相关代码#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#else
// 其他平台处理
#endifint main() {
#ifdef  __linux__// 创建socketint server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {std::cerr << "Error creating socket\n";return 1;}// 绑定IP和端口struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8888);if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Binding failed\n";return 1;}// 开始监听listen(server_fd, 5);// 等待连接int client_fd = accept(server_fd, NULL, NULL);if (client_fd < 0) {std::cerr << "Error accepting connection\n";return 1;}// 从客户端接收数据char buffer[1024] = { 0 };read(client_fd, buffer, 1024);std::cout << "Received: " << buffer << std::endl;// 发送数据到客户端std::string response = "Hello from server";send(client_fd, response.c_str(), response.size(), 0);// 关闭连接close(client_fd);close(server_fd);#elif defined(_WIN32)// Initialize WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);if (iResult != 0) {std::cerr << "WSAStartup failed with error: " << iResult << std::endl;return 1;}// Create a TCP server socketSOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (serverSocket == INVALID_SOCKET) {std::cerr << "Error creating server socket" << std::endl;WSACleanup();return 1;}// Bind the socket to a portsockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(12345); // Port numberif (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "Bind failed with error" << std::endl;closesocket(serverSocket);WSACleanup();return 1;}// Listen for incoming connectionsif (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {std::cerr << "Listen failed with error" << std::endl;closesocket(serverSocket);WSACleanup();return 1;}// Accept a client connectionSOCKET clientSocket = accept(serverSocket, NULL, NULL);if (clientSocket == INVALID_SOCKET) {std::cerr << "Accept failed with error" << std::endl;closesocket(serverSocket);WSACleanup();return 1;}// Send data to the clientstd::string message = "Hello, client!";send(clientSocket, message.c_str(), message.size(), 0);// Close the socketsclosesocket(clientSocket);closesocket(serverSocket);WSACleanup();
#else#endif //  __linux__return 0;
}
}

Client.cpp

#include <iostream>
#include <string>#ifdef __linux__
// Linux平台相关代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#elif defined(_WIN32)
// Windows平台相关代码#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#else
// 其他平台处理
#endifint main() {#ifdef __linux__// Linux平台相关代码// 创建socketint client_fd = socket(AF_INET, SOCK_STREAM, 0);if (client_fd == -1) {std::cerr << "Error creating socket\n";return 1;}// 连接到服务器struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8888);if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {std::cerr << "Invalid address\n";return 1;}if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Connection failed\n";return 1;}// 发送数据到服务器std::string message = "Hello from client";send(client_fd, message.c_str(), message.size(), 0);// 接收服务器响应char buffer[1024] = { 0 };read(client_fd, buffer, 1024);std::cout << "Server response: " << buffer << std::endl;// 关闭连接close(client_fd);#elif defined(_WIN32)// Windows平台相关代码// Initialize WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);if (iResult != 0) {std::cerr << "WSAStartup failed with error: " << iResult << std::endl;return 1;
}// Create a TCP client socketSOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (clientSocket == INVALID_SOCKET) {std::cerr << "Error creating client socket" << std::endl;WSACleanup();return 1;}// Connect to the serversockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP addressserverAddr.sin_port = htons(12345); // Port numberif (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "Connect failed with error" << std::endl;closesocket(clientSocket);WSACleanup();return 1;}// Receive data from the serverchar buffer[1024] = { 0 };recv(clientSocket, buffer, 1024, 0);std::cout << "Server says: " << buffer << std::endl;// Close the socketclosesocket(clientSocket);WSACleanup();#else// 其他平台处理
#endifreturn 0;
}

result:
在这里插入图片描述

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

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

相关文章

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…

HarmonyOS NEXT - 通过 module 模块化引用公共组件和utils

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT 一、HAP & HSP & HAR介绍HAP官方介绍HAR官方介绍HSP官方介绍怎么理解App、HAP、HAR的关系HAR如何转换为HSPHSP模块如何快速切换成HAR模块 二…

PDF转markdown工具:magic-pdf

1. magic-pdf 环境安装 conda create -n MinerU python3.10 conda activate MinerU pip install boto3>1.28.43 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install magic-pdf[full]0.7.0b1 --extra-index-url https://wheels.myhloli.com -i https://pypi.tuna.t…

《深入浅出多模态》(八)多模态经典模型:MiniGPTv4

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

【el-table】横向滚动条加粗后,滚动到固定列下被遮挡,已解决

横向滚动条按要求加粗后&#xff0c;遇到的问题&#xff1a;列表的操作列是固定在最右侧的&#xff0c;当滚动条滑动到最右侧的时候&#xff0c;滚动条被遮挡了 我尝试了几种方法都不行&#xff0c;比如找到.el-table__fixed-right .el-table__fixed-footer-wrapper &#xff…

智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航

随着科技的飞速发展&#xff0c;药品仓库的安全管理正迎来前所未有的变革。药品作为直接关系到公众健康的重要物资&#xff0c;其安全存储和监管显得尤为重要。在这个背景下&#xff0c;视频汇聚平台EasyCVR视频智能管理系统的应用&#xff0c;为药品仓库的安全监管提供了强有力…

el-tree树状控件,定位到选中的节点的位置

效果图 在el-tree 控件加 :render-content"renderContent" 在掉接口的方法中 实际有用的是setTimeout 方法和this.$refs.xxxxxx.setCheckedKeys([industrycodeList]) if(res.data.swindustrylist.length>0){res.data.swindustrylist.forEach(item > {industry…

Ubuntu | 解决 VMware 中 Ubuntu 虚拟机磁盘空间不足问题

目录 一、存在的问题二、解决的步骤第一步&#xff1a;扩展磁盘空间第二步&#xff1a;查看磁盘空间使用情况第三步&#xff1a;安装分区工具第四步&#xff1a;启动分区工具第五步&#xff1a;修改挂载文件夹的读写权限第六步&#xff1a;扩展文件系统大小第七步&#xff1a;验…

【文献阅读】2024 DAVE 基于密度检测

摘要、图、模型架构 提出什么模块 解决什么问题 摘要 Low-shot counters estimate the number of objects corresponding to a selected category, based on only few or no exemplars annotated in the image. The current state-ofthe-art estimates the total counts as th…

【Harmony OS 4.0】待办列表案例

src/main/ets/example1/Models.ets // 定义class类数据模型 export class TaskDataModel {// private 私有属性&#xff0c;在类对象外不允许随意更改数据&#xff0c;必须本地初始化。private tasks: Array<string> [早起晨练, 准备早餐, 阅读名著, 学习ArkTs, 玩游戏…

电子电气架构 --- 车载以太网

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

Python 全栈系列262 使用sqlalchemy(clickhouse)

说明 再补充一篇。之前连不上的原因也挺搞笑&#xff0c;大概是deepseek把我带偏了&#xff0c; 应该是 pip3 install clickhouse-sqlalchemy -i https://mirrors.aliyun.com/pypi/simple/ 但是它教我 pip3 install sqlalchemy-clickhouse -i https://mirrors.aliyun.com/py…

【实用工具】使用Chrome插件搭建第二大脑!SuperMemory大语言模型登场,开源、免费、保存你需要的所有网站!——含入门安装教程

文章目录 项目简介项目搭建主要功能How do I use this?本地部署 项目简介 最近&#xff0c;有一款Github项目十分火爆&#xff0c;它专注于用超级内存打造自己的第二大脑。它是书签的 ChatGPT&#xff0c;基于Chrome 浏览器扩展导入推文或保存网站和内容&#xff0c;你可以访…

【计算机人接私活】手把手教你上手挖到第一个漏洞,从底薪3k到月入过万,只有一步之遥!

计算机人想接靠谱的私活&#xff1f;看这篇&#xff01; 暑假想做兼职赚生活费&#xff1f;看这篇&#xff01; 挖漏洞找不到门路&#xff1f;看这篇&#xff01; 挖漏洞必备工具 Up入行网安多年&#xff0c;一直在探索副业项目。 从最初的月薪5k&#xff0c;到现在一个漏…

基于javaEE的校园二手书交易平台的设计与实现

TOC springboot287基于javaEE的校园二手书交易平台的设计与实现 第1章 绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在这个…

EWM 批次管理 / Batch Management

目录 1 简介 2 业务数据 2.1 基于 PO&#xff0c;创建 ERP LE - Delivery 内向交货单&#xff0c;同时同步到 EWM 交货单 2.2 在 EWM 内向交货单&#xff0c;创建批次。EWM 批次创建的前提条件来自于物料主数据批次分类&#xff08;023&#xff09;决定的。SAP 提供的标准条…

【数据结构】二叉树(三)精选Oj题

本篇已经是二叉树第三篇啦&#xff0c;下面讲解相关面试题&#xff0c;写作不易&#xff0c;求路过的朋友给个点赞与收藏呀~ 目录 1、相同的树 2、另一颗树的子树 3、翻转二叉树 4、对称二叉树 5、平衡二叉树 6、构建二叉树 7、二叉树的最近公共祖先 孩子双亲解法 二叉…

大端存储与小端存储

大端存储与小端存储 什么大端存储什么是小端存储 大端存储&#xff08;Big-endian&#xff09;和小端存储&#xff08;Little-endian&#xff09;是计算机科学中数据在内存中存储的两种不同方式&#xff0c;主要涉及多字节数据类型&#xff08;如整数、浮点数&#xff09;的字…

vue3 组合式 API:setup()

查看vue3官网介绍&#xff1a;组合式 API&#xff1a;setup() 在 Vue 3 中&#xff0c;组合式 API 的 setup() 函数是一个非常重要的特性&#xff0c;它提供了一种更灵活和可维护的方式来组织组件的逻辑。 基本概念 setup() 函数是在组件实例创建之前执行的&#xff0c;它用于…

零基础STM32单片机编程入门(三十八) 多传感器模块之跌倒检测实战源码

文章目录 一.概要二.实验原理三.实验控制流程四.STM32单片机跌倒监测实验(MPU6050直流有刷电机蜂鸣器)五.CubeMX工程源代码下载六.实验效果视频七.小结 一.概要 据统计每年约有 300 万老年人因跌倒受伤而在急诊室接受治疗&#xff0c;每五次跌倒就有一次会造成伤害&#xff0c…