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

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:
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通过共享目录上传后门
  • 学习Flutter时需要了解的背景知识
  • 实现将docx转成PDF
  • django中的MESSAGE组件
  • 支持S/MIME证书的邮件客户端有哪些?
  • 【Java学习】Stream流详解
  • 短视频SDK解决方案,降低行业开发门槛
  • pytorch实现单层线性回归模型
  • 探索工业互联网智能赋能智能制造算法综述
  • 工程数学线性代数(同济大学数学系)第六版(更新中)
  • 2024 年的 Node.js 生态系统
  • 输出倒闭输入
  • Android Studio报错 Failed to transform ‘...‘ using Jetifier. Reason null
  • 学生阅读行为与图书预定平台的设计与实现(全网独一无二,24年最新定做)
  • Qt 字符串类应用
  • [译]Python中的类属性与实例属性的区别
  • 【Linux系统编程】快速查找errno错误码信息
  • AWS实战 - 利用IAM对S3做访问控制
  • conda常用的命令
  • es6--symbol
  • java 多线程基础, 我觉得还是有必要看看的
  • java8 Stream Pipelines 浅析
  • opencv python Meanshift 和 Camshift
  • Python学习之路16-使用API
  • scrapy学习之路4(itemloder的使用)
  • Sublime text 3 3103 注册码
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 基于遗传算法的优化问题求解
  • 解决iview多表头动态更改列元素发生的错误
  • 京东美团研发面经
  • 使用common-codec进行md5加密
  • 微信公众号开发小记——5.python微信红包
  • 一个JAVA程序员成长之路分享
  • Linux权限管理(week1_day5)--技术流ken
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 从如何停掉 Promise 链说起
  • ​2020 年大前端技术趋势解读
  • #pragam once 和 #ifndef 预编译头
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (javascript)再说document.body.scrollTop的使用问题
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (区间dp) (经典例题) 石子合并
  • (十)c52学习之旅-定时器实验
  • (四)模仿学习-完成后台管理页面查询
  • (算法)硬币问题
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Linux整合apache和tomcat构建Web服务器
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Framework .NET Core与 .NET 的区别
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net生成的类,跨工程调用显示注释