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

Windows 平台 TCP 通信开发指南

开篇介绍

在 Windows 平台进行 TCP 通信开发,是网络编程中的常见需求。本文将详细讲解在 Windows 平台下,如何利用 Winsock API 实现高效的 TCP 客户端与服务端通信。

使用示例

必须引入的头文件

#include <windows.h>
#pragma comment(lib,"ws2_32.lib")// 自动链接库文件

1)环境初始化

共同实现

// 所有网络程序必须先初始化Winsock
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);

独有实现

服务端初始化

// 服务端需指定监听地址和端口
sockaddr_in server_addr{};	//C++11方式初始化为0,不需要额外调用 memset
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;  	// 监听所有IP
server_addr.sin_port = htons(12345);      	// 指定端口 转换网络字节序

客户端初始化

// 客户端需明确目标地址,连接服务端
sockaddr_in server_addr{};	//C++11方式初始化
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  // 服务端IP
server_addr.sin_port = htons(12345);                   // 服务端端口

2)Socket创建

共同实现

// 创建TCP流式Socket(IPv4协议族)
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

3)连接建立

服务端独有流程

// 绑定地址到Socket
bind(server_socket, (SOCKADDR*)&server_addr, sizeof(server_addr));// 开启监听模式
listen(server_socket, 5);  // 最大等待队列长度// 接受客户端连接(阻塞式)
SOCKET client_socket;
sockaddr_in client_addr{};
int addr_len = sizeof(client_addr);
client_socket = accept(server_socket, (SOCKADDR*)&client_addr, &addr_len);

客户端独有流程

// 主动发起连接请求
connect(client_socket, (SOCKADDR*)&server_addr, sizeof(server_addr));

关键判断
if (connect() == SOCKET_ERROR) // 处理连接失败

4)数据传输

服务端独有逻辑

// 通常先发送欢迎信息
send(client_socket, welcome_msg, strlen(welcome_msg) + 1, 0);// 持续接收客户端请求
while (true) {recv(client_socket, buffer, sizeof(buffer), 0);// 处理业务逻辑send(client_socket, response, response_len, 0);
}

客户端独有逻辑

// 接收服务端初始响应
recv(client_socket, buffer, sizeof(buffer), 0);// 持续交互循环
while (true) {// 获取用户输入send(client_socket, input_data, data_len, 0);// 等待服务端响应recv(client_socket, response, sizeof(response), 0);
}

共同核心方法

// 发送数据
int sent_bytes = send(sock, data, data_len, 0);// 接收数据
int recv_bytes = recv(sock, buffer, buf_size, 0);

关键判断
if (recv_bytes <= 0) // 连接异常或关闭
if (sent_bytes == SOCKET_ERROR) // 发送失败处理

5)连接终止

服务端

// 需关闭两个 Socket
closesocket(client_socket);
closesocket(server_socket);

客户端

closesocket(client_socket); //关闭客户端即可

共同操作

// 所有网络程序必须释放资源
WSACleanup();

总结流程图

[客户端]                        [服务端]
WSAStartup                    WSAStartup
socket()                      socket()
connect() → → → → → → → → → → bind()listen()accept()
send()/recv() ↔ ↔ ↔ ↔ ↔ ↔ ↔ ↔ recv()/send()
closesocket()                 closesocket()
WSACleanup                    WSACleanup

快速测试方法

  • 运行服务端程序
  • 用 Telnet 测试:
      telnet 127.0.0.1 12345
    

关键步骤对比

步骤服务端客户端
1. 初始化WSAStartupWSAStartup
2. 创建Socketsocket()socket()
3. 绑定端口bind() (必须)×
4. 建立连接listen()accept()connect()
5. 收发数据send()/recv()send()/recv()
6. 关闭连接closesocket()closesocket()

关于 sock 的理解?

在发送和接收数据时,sock 是用于通信的套接字对象。其具体含义取决于当前的操作是在客户端还是服务端进行:

  • 在服务端 :当服务端调用 accept() 函数接受客户端的连接请求后,会返回一个新的套接字,即 client_socket。在这个新的套接字上进行 send()recv() 操作,发送和接收的是与该特定客户端通信的数据。这个 client_socket 就是与客户端通信的套接字。
  • 在客户端 :客户端调用 connect() 函数与服务端建立连接后,使用的 sock 是客户端自己的套接字,通过它与服务端进行数据通信。

所以,不管是在客户端还是服务端,send()recv() 函数中的 sock 都是代表与对方通信的套接字,用于在双方之间传输数据。

掌握这些核心要点,即可快速实现 Windows 平台的 TCP 双工通信。建议结合 Wireshark 抓包工具进行协议分析调试。

相关文章:

Windows 平台 TCP 通信开发指南

开篇介绍 在 Windows 平台进行 TCP 通信开发&#xff0c;是网络编程中的常见需求。本文将详细讲解在 Windows 平台下&#xff0c;如何利用 Winsock API 实现高效的 TCP 客户端与服务端通信。 使用示例 必须引入的头文件 #include <windows.h> #pragma comment(lib,&q…...

【NLP 76、Faiss 向量数据库】

压抑与痛苦&#xff0c;那些辗转反侧的夜&#xff0c;终会让我们更加强大 —— 25.5.20 Faiss&#xff08;Facebook AI Similarity Search&#xff09;是由 Facebook AI 团队开发的一个开源库&#xff0c;用于高效相似性搜索的库&#xff0c;特别适用于大规模向…...

软件名称:系统日志监听工具 v1.0

软件功能&#xff1a;一款基于 PyQt5 开发的 Windows 系统日志监听工具&#xff0c;适用于系统运维、网络管理、故障排查等场景&#xff0c;具备以下核心功能&#xff1a; 支持监听系统三大日志源&#xff1a;应用程序 / 系统 / 安全日志实时抓取新日志事件&#xff0c;自动滚…...

Spring AI 之结构化输出转换器

截至 2024 年 2 月 5 日,旧的 OutputParser、BeanOutputParser、ListOutputParser 和 MapOutputParser 类已被弃用,取而代之的是新的 StructuredOutputConverter、BeanOutputConverter、ListOutputConverter 和 MapOutputConverter 实现类。后者可直接替换前者,并提供相同的…...

Java虚拟机面试题:内存管理(上)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

进程间通信I·匿名管道

目录 进程间通信&#xff08;IPC&#xff09; 含义 目的 分类 匿名管道 原理 创建过程 特性 四大情况 close问题 代码练习 简单通信 进程池 小知识 进程间通信&#xff08;IPC&#xff09; 含义 就是让不同的进程能看到同一份资源&#xff0c;实现数据交流。 …...

Ubuntu Linux系统的基本命令详情

1.Ubuntu Linux是以桌面应用为主的Linux发行版操作系统 2.Ubuntu的用户使用 在登录系统一般使用在安装系统时建立的普通用户登录&#xff0c;如果要使用超级用户权限 #sudo ---执行命令 sudo passwd ---修改用户密码 su - root ---切换超级用户 系统的不同&#xff0c;命令也不…...

大数据治理:理论、实践与未来展望(二)

书接上文 文章目录 七、大数据治理的未来发展趋势&#xff08;一&#xff09;智能化与自动化&#xff08;二&#xff09;数据隐私与安全的强化&#xff08;三&#xff09;数据治理的云化&#xff08;四&#xff09;数据治理的跨行业合作&#xff08;五&#xff09;数据治理的生…...

PCB布局设计

PCB布局设计 一、原理图到PCB转换前的准备工作 在将原理图转换为PCB之前&#xff0c;我们需要进行一系列准备工作&#xff0c;确保设计的正确性和完整性。这一步骤至关重要&#xff0c;可以避免后续PCB设计中出现不必要的错误。 // 原理图转PCB前必要检查步骤 // 1. 仔细检查…...

【49. 字母异位词分组】

Leetcode算法练习 笔记记录 49. 字母异位词分组 49. 字母异位词分组 public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map new HashMap<>();for (int i 0; i < strs.length; i) {//排序就是相同字符了…...

用 AI 让学习更懂你:如何打造自动化个性化学习系统?

用 AI 让学习更懂你:如何打造自动化个性化学习系统? 在这个信息爆炸的时代,传统的学习方式已经难以满足个体化需求。过去,我们依赖固定的教学课程,所有学生按照统一进度进行学习,但每个人的学习节奏、兴趣点和理解方式都不尽相同。而人工智能(AI)正在彻底改变这一局面…...

esp32+IDF V5.1.1版本编译freertos报错

error: portTICK_RATE_MS undeclared (first use in this function); did you mean portTICK_PERIOD_MS 解决方法: 使用命令 idf.py menuconfig 打开配置界面配置freeRtos 使能configENABLE_BACKWARD_COMPATIBLITY...

嵌入式软件-如何做好一份技术文档?

嵌入式软件-如何做好一份技术文档&#xff1f; 文章目录 嵌入式软件-如何做好一份技术文档&#xff1f;一.技术文档的核心价值与挑战二.文档体系的结构化设计三.精准表达嵌入式特有概念四. **像管理代码一样管理文档**&#xff0c;代码与文档的协同维护五.质量评估与持续改进5.…...

笔记本6GB本地可跑的图生视频项目(FramePack)

文章目录 &#xff08;一&#xff09;简介&#xff08;二&#xff09;本地执行&#xff08;2.1&#xff09;下载&#xff08;2.2&#xff09;更新&#xff08;2.3&#xff09;运行&#xff08;2.4&#xff09;生成 &#xff08;三&#xff09;注意&#xff08;3.1&#xff09;效…...

SpringMVC实战:动态时钟

引言 在现代 Web 开发中&#xff0c;选择一个合适的框架对于项目的成功至关重要。Spring MVC 作为 Spring 框架的核心模块之一&#xff0c;以其清晰的架构、强大的功能和高度的可配置性&#xff0c;成为了 Java Web 开发领域的主流选择。本文将通过一个“动态时钟”的实战项目…...

vscode include总是报错

VSCode 的 C/C 扩展可以通过配置 c_cpp_properties.json 来使用 compile_commands.json 文件中的编译信息&#xff0c;包括 include path、编译选项等。这样可以确保 VSCode 的 IntelliSense 与实际编译环境保持一致。 方法一&#xff1a;直接指定 compile_commands.json 路径…...

哈希表的实现(上)

前言 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进行很少的比较次数就能够将…...

【Java高阶面经:微服务篇】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略

一、CAP理论在服务注册与发现中的落地实践 1.1 CAP三要素的技术权衡 要素AP模型实现CP模型实现一致性最终一致性(Eureka通过异步复制实现)强一致性(ZooKeeper通过ZAB协议保证)可用性服务节点可独立响应(支持分区存活)分区期间无法保证写操作(需多数节点可用)分区容错性…...

实验7 HTTP协议分析与测量

实验7 HTTP协议分析与测量 1、实验目的 了解HTTP协议及其报文结构 了解HTTP操作过程&#xff1a;TCP三次握手、请求和响应交互 掌握基于tcpdump和wireshark软件进行HTTP数据包抓取和分析技术 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要求&#xff1…...

python:机器学习概述

本文目录&#xff1a; 一、人工智能三大概念二、学习方式三、人工智能发展史**1950-1970****1980-2000****2010-2017****2017-至今** 四、机器学习三要素五、常见术语六、数据集的划分七、常见算法分类八、机器学习的建模流程九、特征工程特征工程包括**五大步**&#xff1a;特…...

【一. Java基础:注释、变量与数据类型详解】

1. Java 基础概念 1.1 注释 注释&#xff1a;对代码的解释和说明文字 java的三种注释&#xff1a; 单行注释&#xff1a;两个斜杠 // 后面跟着你的注释内容 //哈哈多行注释&#xff1a;以 /* 开头&#xff0c;以 */ 结尾&#xff0c;中间可以写很多行 /*哈哈哈哈哈哈…...

得力DE-620K针式打印机打印速度不能调节维修一例

基本参数: 产品类型 票据针式打印机(平推式) 打印方式 串行点阵击打式 打印宽度 85列 打印针数 24针 可靠性 4亿次/针 色带性能 1000万字符纠错 复写能力 7份(1份原件+6份拷贝) 缓冲区 128KB 接口类型 …...

SAP在金属行业的数字化转型:无锡哲讯科技的智能解决方案

金属行业面临的发展挑战 金属行业作为制造业的基础支柱&#xff0c;涵盖钢铁、有色金属、金属制品等多个细分领域。当前行业正面临原材料价格波动、能耗双控政策、市场竞争加剧等多重压力。数字化转型已成为金属企业提升生产效率、优化供应链、实现绿色可持续发展的必由之路。…...

安装openresty使用nginx+lua,openresty使用jwt解密

yum install -y epel-release yum update yum search openresty # 查看是否有可用包 yum install -y openresty启动systemctl start openresty验证服务状态systemctl status openresty设置开机自启systemctl enable openrestysystemctl stop openresty # 停止服务 system…...

java基础(继承)

什么是继承 继承好处 提高代码的复用性 继承注意事项 权限修饰符 单继承、Object类 冲突&#xff1a; 方法重写 扩展&#xff1a; 其实我们不想看地址&#xff0c;地址看来没用&#xff0c;我们是用来看对象有没有问题 重写toString: 比如这个如果返回的是地址值&#xff0c;…...

python 实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能

多视角三维重建系统 下面我将实现一个完整的基于Python的多视角三维重建系统&#xff0c;包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能。 1. 环境准备与数据加载 首先安装必要的库&#xff1a; pip install opencv-python opencv-contrib-python numpy…...

行列式中某一行的元素与另一行对应元素的代数余子式乘积之和等于零

问题陈述 为什么行列式中某一行&#xff08;列&#xff09;的元素与另一行&#xff08;列&#xff09;对应元素的代数余子式乘积之和等于零&#xff1f;即&#xff1a; ∑ k 1 n a i k C j k 0 ( i ≠ j ) \sum_{k1}^{n} a_{ik} C_{jk} 0 \quad (i \ne j) k1∑n​aik​Cjk​…...

【时时三省】Python 语言----字符串,列表,元组,字典常用操作异同点

目录 1,字符串常用操作 1,创建 2,访问 3,常用方法 4,内置方法 2,列表 1,创建列表 2,访问列表 3,内置方法 3,元组 1,创建 2,访问 3,内置方法 4,字典 1,创建 2,访问 3,内置方法 5,集合 1,创建 2,访问 3,内置方法 山不在高,有仙则名。水不在深,有龙则…...

基于cornerstone3D的dicom影像浏览器 第二十二章 mpr + vr

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

优启通添加自定义浏览器及EXLOAD使用技巧分享

文章目录 优启通添加自定义浏览器及EXLOAD使用技巧分享&#x1f6a9;问题描述&#x1f527;解决方案概述&#x1f4c1;自定义软件添加方法汇总&#x1f9e9;快捷方式配置&#xff1a;exload.cfg 用法大全&#x1f9f7;基础用法&#x1f5c2;分类菜单&#x1f5a5;创建桌面快捷方…...