Windows C++ TCP/IP 两台电脑上互相传输字符串数据

在 Windows 上使用 C++ 实现两个进程通过 TCP/IP 协议传输字符串数据是一个非常常见的任务。我们可以利用 Windows Sockets API (winsock2) 来进行套接字编程。在下面的例子中,我们将演示如何通过 TCP/IP 协议传输字符串数据。这里将包括两个程序:一个是服务器端,另一个是客户端。

1. 环境准备

  1. 安装开发环境:
    • Visual Studio:确保你已经安装了 Visual Studio,且能够编译 C++ 程序。
    • 连接到 ws2_32.lib:如果你使用的是 Visual Studio,它默认包含了 Windows Sockets 库,无需额外配置。

2. 服务器端代码 (Server)

服务器端将监听特定端口,接受来自客户端的连接,并接收字符串数据。

#include <iostream>
#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")  // Link with ws2_32.lib for Winsock#define PORT 8080
#define BUFFER_SIZE 1024int main() {// 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "WSAStartup failed!" << std::endl;return -1;}// 创建服务器套接字SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);if (server_socket == INVALID_SOCKET) {std::cerr << "Socket creation failed!" << std::endl;WSACleanup();return -1;}// 设置服务器地址sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;  // 监听所有接口server_addr.sin_port = htons(PORT);// 绑定套接字到端口if (bind(server_socket, (SOCKADDR*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {std::cerr << "Bind failed!" << std::endl;closesocket(server_socket);WSACleanup();return -1;}// 开始监听客户端请求if (listen(server_socket, 1) == SOCKET_ERROR) {std::cerr << "Listen failed!" << std::endl;closesocket(server_socket);WSACleanup();return -1;}std::cout << "Server listening on port " << PORT << "..." << std::endl;// 接受客户端连接SOCKET client_socket = accept(server_socket, NULL, NULL);if (client_socket == INVALID_SOCKET) {std::cerr << "Accept failed!" << std::endl;closesocket(server_socket);WSACleanup();return -1;}std::cout << "Client connected!" << std::endl;// 接收字符串数据char buffer[BUFFER_SIZE];int bytes_received;while (true) {bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);if (bytes_received <= 0) {break;  // 连接关闭或发生错误}buffer[bytes_received] = '\0';  // 添加字符串结束符std::cout << "Received: " << buffer << std::endl;}// 清理资源closesocket(client_socket);closesocket(server_socket);WSACleanup();return 0;
}

3. 客户端代码 (Client)

客户端将连接到服务器并发送字符串数据。

#include <iostream>
#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")  // Link with ws2_32.lib for Winsock#define SERVER_IP "192.168.10.10"  // 服务器
#define PORT 8080
#define BUFFER_SIZE 1024int main() {// 初始化 WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "WSAStartup failed!" << std::endl;return -1;}// 创建客户端套接字SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);if (client_socket == INVALID_SOCKET) {std::cerr << "Socket creation failed!" << std::endl;WSACleanup();return -1;}// 设置服务器地址sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);// 连接到服务器if (connect(client_socket, (SOCKADDR*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {std::cerr << "Connect failed!" << std::endl;closesocket(client_socket);WSACleanup();return -1;}std::cout << "Connected to server!" << std::endl;// 发送字符串数据const char* message = "Hello, Server! This is the client.";int bytes_sent = send(client_socket, message, strlen(message), 0);if (bytes_sent == SOCKET_ERROR) {std::cerr << "Send failed!" << std::endl;closesocket(client_socket);WSACleanup();return -1;}std::cout << "Message sent to server!" << std::endl;// 清理资源closesocket(client_socket);WSACleanup();return 0;
}

4. 编译和运行

步骤 1:编译代码

  1. 打开 Visual Studio,创建两个 C++ 控制台应用程序:一个用于服务器端,另一个用于客户端。
  2. 需要链接 ws2_32.lib 库,它是 Winsock2 的实现库。在 Visual Studio 中,可以在项目设置中配置链接器输入,添加 ws2_32.lib

步骤 2:运行服务器端

  1. 在命令行中运行服务器程序 server.exe,它将监听端口 8080,等待客户端连接。

    server.exe
    

步骤 3:运行客户端

  1. 在另一个命令行窗口中运行客户端程序 client.exe,客户端将连接到服务器并发送消息。

    client.exe
    

步骤 4:查看输出

  • 服务器端:会打印接收到的消息:

    Received: Hello, Server! This is the client.
    
  • 客户端:会显示发送的消息确认:

    Message sent to server!
    

5. 代码解释

  1. Winsock 初始化和清理:通过 WSAStartup 初始化 Windows 套接字,WSACleanup 清理资源。
  2. 套接字创建和连接:
    • 服务器端:创建一个 TCP 套接字,绑定到本地端口 8080,并开始监听客户端的连接。
    • 客户端:创建一个套接字并连接到服务器的 IP 地址和端口。
  3. 数据发送和接收:
    • 客户端通过 send() 发送一个字符串消息。
    • 服务器通过 recv() 接收消息并打印出来。
  4. 字符串处理:服务器端接收的字符串会加上 \0 字符来确保它是一个有效的 C 字符串。

6. 小结

这个示例展示了如何使用 TCP/IP 协议传输字符串数据:

  • 服务器端等待客户端的连接,并接收来自客户端的字符串消息。
  • 客户端连接到服务器,并发送字符串消息。
  • 通过 winsock2 库进行套接字编程,确保数据的传输是可靠的。

你可以根据实际需求修改和扩展这个基础代码,例如:

  • 增加错误处理(例如,处理数据发送或接收失败的情况)。
  • 支持多客户端连接(通过 select()multithreading)。
  • 在客户端和服务器之间实现更复杂的协议。

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

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

相关文章

OceanStor Pacific系列 8.1.0 功能架构

功能架构 华为OceanStor Pacific系列提供基于三层的分布式存储架构&#xff0c;融合分布式文件、对象、大数据和块多个服务形态&#xff0c;支持文件、对象、大数据服务部署在一个集群&#xff0c;并统一管理。 华为OceanStor Pacific系列整体功能架构由存储接口层、存储服务…

Flink1.19编译并Standalone模式本地运行

1.首先下载源码 2.本地运行 新建local_conf和local_lib文件夹&#xff0c;并且将编译后的文件放入对应的目录 2.1 启动前参数配置 2.1.2 StandaloneSessionClusterEntrypoint启动参数修改 2.1.3 TaskManagerRunner启动参数修改 和StandaloneSessionClusterEntrypoint一样修改…

高效稳定!新加坡服务器托管方案助力企业全球化布局

在全球化的商业环境中&#xff0c;企业对于高效、稳定的服务器托管方案的需求日益迫切。作为亚洲的服务器托管中心&#xff0c;新加坡凭借其独特的地理位置、稳定的政治环境、先进的科技设施以及开放的市场政策&#xff0c;为企业提供了理想的服务器托管解决方案&#xff0c;助…

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象&#xff0c;是用于传输数据的对象&#xff0c;通常在服务层与表现层之间传递数据&#xff0c;DTO 通常用于…

StructuredStreaming (一)

一、sparkStreaming的不足 1.基于微批,延迟高不能做到真正的实时 2.DStream基于RDD,不直接支持SQL 3.流批处理的API应用层不统一,(流用的DStream-底层是RDD,批用的DF/DS/RDD) 4.不支持EventTime事件时间&#xff08;一般流处理都会有两个时间&#xff1a;事件发生的事件&am…

信号-3-信号处理

main 信号捕捉的操作 sigaction struct sigaction OS不允许信号处理方法进行嵌套&#xff1a;某一个信号正在被处理时&#xff0c;OS会自动block改信号&#xff0c;之后会自动恢复 同理&#xff0c;sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零&…

软件工程师简历(精选篇)

【#软件工程师简历#】 一份专业而精准的软件工程师简历&#xff0c;不仅能够全面展示技术实力和项目经验&#xff0c;更是赢得理想工作机会的重要敲门砖。那么&#xff0c;如何撰写一份令人印象深刻的软件工程师简历呢&#xff1f;以下是幻主简历整理的软件工程师简历&#xf…

基于springboot的汽车租赁管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

vscode远程连接服务器并启用tmux挂载进程

使用vscode连接远程服务器&#xff0c;有时候由于主机问题&#xff0c;比如中断&#xff0c;断网&#xff0c;超时&#xff0c;重启&#xff0c;关机等等情况&#xff0c;导致进程中断&#xff0c;如果是一个长时间的进程&#xff0c;会很麻烦&#xff0c;毕竟不能长时间一直盯…

设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

前言&#xff1a; 两个本想描述一样的意思的词&#xff0c;只因一字只差就让人觉得一个是好牛&#xff0c;一个好搞笑。往往我们去开发编程写代码时也经常将一些不恰当的用法用于业务需求实现中&#xff0c;但却不能意识到。一方面是由于编码不多缺少较大型项目的实践&#xff…

鸿蒙HarmonyOS 地图不显示解决方案

基于地图的开发准备已完成的情况下&#xff0c;地图还不显式的问题 首先要获取设备uuid 获取设备uuid 安装DevEco Studio的路径下 有集成好的hdc工具 E:\install_tools\DevEco Studio\sdk\default\openharmony\toolchains 这个路径下打开cmd运行 进入“设置 > 关于手机…

【C语言】值传递和地址传递

值传递 引用传递&#xff08;传地址&#xff0c;传引用&#xff09;的区别 传值&#xff0c;是把实参的值赋值给行参 &#xff0c;那么对行参的修改&#xff0c;不会影响实参的值。 传地址&#xff0c;是传值的一种特殊方式&#xff0c;只是他传递的是地址&#xff0c;不是普通…

C语言入门到精通(第六版)——第十六章

16、网络套接字编程 16.1、计算机网络基础 计算机网络技术是计算机技术和通信技术相结合的产物&#xff0c;代表计算机的一个重要发展方向。了解计算机的网络结构&#xff0c;有助于用户开发网络应用程序。 16.1.1、IP地址 为了使网络上的计算机能够彼此识别对方&#xff0c;…

Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件

本文将介绍一种手动的轻量级的方式&#xff0c;还原HTTP/TLS协议中传输的文件&#xff0c;为流量数据包中的文件分析提供帮助。 如果捕获的数据包中存在非文本类文件&#xff0c;例如png,jpg等图片文件&#xff0c;或者word&#xff0c;Excel等office文件异或是其他类型的二进…

记录使用documents4j来将word文件转化为pdf文件

本文记录使用documents4j来将word文件转化为pdf文件 文章目录 程序实例maven导入代码实现程序结果 本文小结 程序实例 maven导入 <!--word转pdf--><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactI…

SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间

SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…

WordPress 6.7 “Rollins”发布

每个 WordPress 版本都会向一位在音乐界留下不可磨灭印记的艺术家致敬。WordPress 6.7 的代号为“Rollins”&#xff0c;旨在向传奇爵士萨克斯演奏家桑尼罗林斯致敬。罗林斯是爵士乐界最伟大的即兴演奏家和先驱之一&#xff0c;他以精湛的技术、创新精神和无畏的音乐表达方式影…

844.比较含退格的字符串

java用 O&#xff08;1&#xff09;空间这个方法&#xff0c;容易挺多bug的… O&#xff08;1&#xff09;空间 #&#xff1a;删除前一个字符 》 从后面开始判断&#xff08;这样可以用跳过的思想&#xff09;不能使用两次 i- - 来处理 # 的操作&#xff0c;会造成误删了前面…

WLAN消失或者已连接但是访问不了互联网

目录 1、WLAN已连接但是访问不了互联网 2、WLAN图标消失 今晚电脑突然连不上网了&#xff0c;重启试了好多种办法都没有用。 1、WLAN已连接但是访问不了互联网 这个的问题很多&#xff0c;建议直接网络重置&#xff0c;即将网络驱动全部删除&#xff0c;然后重新安装。 首先…