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

ops/2024/11/19 22:19:04/

在 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.ppmy.cn/ops/135079.html

相关文章

Spring Boot教程之Spring Boot简介

Spring Boot 简介 接下来一段时间&#xff0c;我会持续发布并完成Spring Boot教程 Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序&#xff0c;Spring 提供了 Spring MVC&#xff0c;它是 Spring 的一个广泛使用的模块&#xff0c;用于创建可扩展的 Web 应用程序。…

笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)

1. 基本信息 论文标题: 《Rethinking Local Perception in Lightweight Vision Transformer》中文标题: 《重新思考轻量化视觉Transformer中的局部感知》作者单位: 清华大学发表时间: 2023论文地址: https://arxiv.org/abs/2303.17803代码地址: https://github.com/qhfan/CloF…

【设计模式】入门 23 种设计模式(代码讲解)

入门 23 种设计模式&#xff08;代码讲解&#xff09; 1.创建型模式2.适配器模式3.行为型模式 设计模式是在软件设计中反复出现的问题的 通用解决方案。它们是经过多次验证和应用的指导原则&#xff0c;旨在帮助软件开发人员解决特定类型的问题&#xff0c;提高代码的可维护性、…

网络安全检测技术

一&#xff0c;网络安全漏洞 安全威胁是指所有能够对计算机网络信息系统的网络服务和网络信息的机密性&#xff0c;可用性和完整性产生阻碍&#xff0c;破坏或中断的各种因素。安全威胁可分为人为安全威胁和非人为安全威胁两大类。 1&#xff0c;网络安全漏洞威胁 漏洞分析的…

动手学深度学习70 BERT微调

1. BERT微调 2. 自然语言推理数据集 3. BERT微调代码 4. QA 9 10, 一般不固定&#xff0c;固定参数可以使训练速度加快&#xff0c;可以尝试 11 应该能 12 本身很快技术细节–>精度高 13 bert一般可以用工具转成c 开销大。考虑怎么提升bert性能。 14 设备性能不高&#xf…

kafka基础

文章目录 一、Kafka入门1.1、JMS1.2、生产者-消费者模式1.3、ZooKeeper 二、kafka基础架构2.1、producer2.2、kafka cluster2.2.1、broker2.2.2、Controller2.2.3、Topic2.2.4、Partition2.2.5、Replication2.2.6、Leader & Follower 2.3、consumer 一、Kafka入门 Kafka是一…

汽车资讯新视角:Spring Boot技术革新

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…