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

news2024/9/23 11:13:00

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
// 其他平台处理
#endif


int main() {
#ifdef  __linux__
    // 创建socket
    int 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 Winsock
    WSADATA 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 socket
    SOCKET 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 port
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(12345); // Port number
    if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "Bind failed with error" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // Listen for incoming connections
    if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "Listen failed with error" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // Accept a client connection
    SOCKET 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 client
    std::string message = "Hello, client!";
    send(clientSocket, message.c_str(), message.size(), 0);

    // Close the sockets
    closesocket(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
// 其他平台处理
#endif

int main() {

#ifdef __linux__
    // Linux平台相关代码
    // 创建socket
    int 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 Winsock
    WSADATA 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 socket
    SOCKET 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 server
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP address
    serverAddr.sin_port = htons(12345); // Port number
    if (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 server
    char buffer[1024] = { 0 };
    recv(clientSocket, buffer, 1024, 0);
    std::cout << "Server says: " << buffer << std::endl;

    // Close the socket
    closesocket(clientSocket);
    WSACleanup();

#else
    // 其他平台处理
#endif
   
    return 0;
}

result:
在这里插入图片描述

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

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

相关文章

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…

SSA-SVM多变量回归预测|樽海鞘群优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&a…

Chrome浏览器更改默认User-Agent

一、业务需求 二、插件下载 三、插件使用 原创文章&#xff0c;请勿转载&#xff01; 详细教程教你如何更改默认浏览器的User-Agent&#xff0c;几分钟足以&#xff01; 一、业务需求 当我们遇到一些特定的UA才能访问的网址时&#xff0c;我们就可以通过一些手段来修改我们浏…

Python之字符串练习题(下)

21.nameStr“Albert Einstein"&#xff0c;如何使用字符串运算符“:”来提取 nameStr 中的名和姓? mingnameStr[:6] xingnameStr[7:]23.下面哪些语句在运行时不会出错? (a)var xyz ’ * 10.5 (b)var ‘xyz’ * ‘5 ©var‘’xyz’*5 (d)var‘xyz’*5.0 重复运算符…

HTML静态网页成品作业(HTML+CSS)——美食企业介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

在亚马逊云科技上对Stable Diffusion模型提示词、输出图像内容进行安全审核

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技机器学习托…

HighPoint SSD7749M2:128TB NVMe 存储卡实现28 GB/s高速传输

HighPoint Technologies推出了一款全新的SSD7749M2 RAID卡&#xff0c;能够在标准的桌面工作站中安装多达16个M.2 SSD&#xff0c;实现高达128TB的闪存存储。该卡通过PCIe Gen4 x16接口提供高达28 GB/s的顺序读写性能。这些令人瞩目的性能规格伴随着高昂的价格标签。 #### 技术…

ArcGIS Pro基础:设置快速访问工具栏

上图【红色框线】内显示就是快速访问工具栏&#xff0c;访问非常方便&#xff0c;不需要切换到选项卡了 上图显示&#xff0c;可以勾选或者取消进行设置&#xff0c;通过【更多命令】可以选择更多的工具 如上图所示&#xff0c;可以选择自己经常使用的命令&#xff0c;可以输入…

手撕线程池

1.手撕线程池原理图 2.代码实现 // 手撕线程池 public class Main {public static void main(String[] args) {ThreadPool threadPool new ThreadPool(1,1000,TimeUnit.MILLISECONDS,1,(queue, task) -> {queue.putByTime(task,1500,TimeUnit.MILLISECONDS);});for (int i…

LangChain 实战演练:借助 LangChain SQL Agent 与 GPT 实现文档智能分析及交互

LangChain实战&#xff1a;利用LangChain SQL Agent和GPT进行文档分析和交互 我最近接触到一个非常有趣的挑战&#xff0c;涉及到人工智能数字化大量文件的能力&#xff0c;并使用户可以在这些文件上提出复杂的与数据相关的问题&#xff0c;比如&#xff1a; 数据检索问题&…

【qt】基于tcp的消息发送

我们需要实现客户端发消息&#xff0c;服务端接收消息 服务端界面新增接收消息 实现客户端发送和清空 发送数据需要将发送栏的信息转化为QByteArray,然后使用socket的write发送过去 实现服务端的接收 效果演示 20240818_111603 代码展示 server Widget.h #ifndef WIDGET_H …

Java的File类与IO流

目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2、列出目录的下一级 3、File类的重命名功能 4、判断功能的方法 5、创建、删除功能 1.4 练习 2. IO流原理及流的分类 2.1 Java IO原理 2.2 流的分类 2.3 流的API 3. …

如何在 Windows/Mac/在线/iPhone/Android 上将 PDF 转换为 Word

PDF&#xff08;便携式文档格式&#xff09;是一种流行的格式&#xff0c;广泛用于在数字电子设备中呈现文档。输出文件小且兼容性强&#xff0c;使 PDF 如此受欢迎。但是&#xff0c;编辑 PDF 文件并非免费。您无需购买 PDF 编辑器&#xff0c;而是可以将 PDF 转换为 Word 进行…

「OC」NSPredicate —— 使用谓词过滤元素

「OC」NSPredicate —— 使用谓词过滤元素 文章目录 「OC」NSPredicate —— 使用谓词过滤元素前言介绍常见用法**比较运算符****逻辑运算符****字符串比较运算符****聚合运算符****用于字典或者类当中****格式说明符&#xff08;占位符&#xff09;** 实际运用总结参考文章 前…

05创建型设计模式——原型模式

一、原型模式简介 原型模式&#xff08;Prototype Pattern&#xff09;模式是一种对象创建型模式&#xff0c;它采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例&#xff0c;具有与原型一样的数据。 1&#xff09;由原型对象自身创建目标对象。换句话说&…

python基础语法 010 类和对象-3 方法

1.3 方法 属性表示是一个类当中的成员或类的特征&#xff0c;而方法是&#xff1f;&#xff1f; 方法&#xff1a;表示类、对象的行为&#xff0c;方法本质上是函数&#xff0c;是一个特殊的函数 属性名称一般为名词&#xff0c;方法名称一般为动词 1.3.1 方法 VS 属性 1、…

24/8/17算法笔记 DDPG算法

深度确定性策略梯度&#xff08;DDPG&#xff09;算法是一种用于解决连续动作空间强化学习问题的算法。它结合了确定性策略梯度&#xff08;DPG&#xff09;和深度学习技术的优点&#xff0c;通过Actor-Critic框架进行策略和价值函数的近似表示。DDPG算法的关键组成部分包括经验…

【RAG综述】北京大学检索增强技术综述

RAG for AIGC ​ 图 1 描述了一个典型的 RAG 过程。给定一个输入查询&#xff0c;检索器识别相关的数据源&#xff0c;检索到的信息与生成器交互以改进生成过程。根据检索结果如何增强生成&#xff0c;有几种基础范式&#xff08;简称基础&#xff09;&#xff1a;它们可以作为…

STM32的蜂鸣器

蜂鸣器分为有源蜂鸣器和无源蜂鸣器。 有源蜂鸣器&#xff1a;内部有震荡源&#xff0c;只要通电即可自动发出固定频率的声音。&#xff08;频率固定无 法控制音色&#xff09; 。 无源蜂鸣器&#xff1a;内部无震荡源&#xff0c;需要外部脉冲信号驱动发声&#xff0c;声音频…

《机器学习》 线性回归 一元、多元 推导 No.3

一、什么是线性回归 线性回归是一种用于预测连续数值的机器学习算法。它基于输入特征与目标变量之间的线性关系建立了一个线性模型。线性回归的目标是找到最佳拟合直线&#xff0c;以最小化预测值与实际值之间的误差。这个线性模型可以用来进行预测和推断。 线性回归的模型可以…