一个简单的Windows TCP服务器实现

news/2025/2/14 2:54:02/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

包含头文件

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><winsock2.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
code>

需要链接的库文件

<code class="prism language-c">ws2_32class="token punctuation">.lib
code>

winsocket初始化

<code class="prism language-c">WSADATA wsaDataclass="token punctuation">;
SOCKET serverSocketclass="token punctuation">, clientSocketclass="token punctuation">;
class="token keyword">struct class="token class-name">sockaddr_in serverAddr class="token operator">= class="token punctuation">{ class="token number">0x00 class="token punctuation">}class="token punctuation">;
class="token keyword">struct class="token class-name">sockaddr_in clientAddr class="token operator">= class="token punctuation">{ class="token number">0x00 class="token punctuation">}class="token punctuation">;
class="token keyword">int clientAddrLen class="token operator">= class="token keyword">sizeofclass="token punctuation">(clientAddrclass="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(class="token function">WSAStartupclass="token punctuation">(class="token function">MAKEWORDclass="token punctuation">(class="token number">2class="token punctuation">, class="token number">2class="token punctuation">)class="token punctuation">, class="token operator">&wsaDataclass="token punctuation">) class="token operator">!= class="token number">0class="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"WSAStartup failed.\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

创建winsocket

<code class="prism language-c">class="token keyword">if class="token punctuation">(class="token punctuation">(serverSocket class="token operator">= class="token function">socketclass="token punctuation">(AF_INETclass="token punctuation">, SOCK_STREAMclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">) class="token operator">== INVALID_SOCKETclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Socket failed.\n"class="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

IP及端口号配置

<code class="prism language-c">serverAddrclass="token punctuation">.sin_family class="token operator">= AF_INETclass="token punctuation">;
serverAddrclass="token punctuation">.sin_addrclass="token punctuation">.s_addr class="token operator">= INADDR_ANYclass="token punctuation">;
serverAddrclass="token punctuation">.sin_port class="token operator">= class="token function">htonsclass="token punctuation">(class="token number">9988class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(class="token function">bindclass="token punctuation">(serverSocketclass="token punctuation">, class="token punctuation">(class="token keyword">struct class="token class-name">sockaddrclass="token operator">*class="token punctuation">)class="token operator">&serverAddrclass="token punctuation">, class="token keyword">sizeofclass="token punctuation">(serverAddrclass="token punctuation">)class="token punctuation">) class="token operator">== SOCKET_ERRORclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Bind failed.\n"class="token punctuation">)class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

监听客户端连接

<code class="prism language-c">class="token keyword">if class="token punctuation">(class="token function">listenclass="token punctuation">(serverSocketclass="token punctuation">, class="token number">5class="token punctuation">) class="token operator">== SOCKET_ERRORclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Listen failed.\n"class="token punctuation">)class="token punctuation">;class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

接受客户端连接

<code class="prism language-c">class="token keyword">if class="token punctuation">(class="token punctuation">(clientSocket class="token operator">= class="token function">acceptclass="token punctuation">(serverSocketclass="token punctuation">, class="token punctuation">(class="token keyword">struct class="token class-name">sockaddrclass="token operator">*class="token punctuation">)class="token operator">&clientAddrclass="token punctuation">, class="token operator">&clientAddrLenclass="token punctuation">)class="token punctuation">) class="token operator">== INVALID_SOCKETclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Accept failed.\n"class="token punctuation">)class="token punctuation">;class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
class="token punctuation">}
code>

接收数据

<code class="prism language-c">class="token keyword">int bytesReceived class="token operator">= class="token function">recvclass="token punctuation">(clientSocketclass="token punctuation">, class="token punctuation">(class="token keyword">charclass="token operator">*class="token punctuation">)class="token punctuation">(_sRxBuffer class="token operator">+ _sRxLenghtclass="token punctuation">)class="token punctuation">, BUFFER_SIZEclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
code>

发送数据

<code class="prism language-c">class="token keyword">int txPacketlenght class="token operator">= class="token function">sendclass="token punctuation">(socketclass="token punctuation">, class="token punctuation">(class="token keyword">const class="token keyword">charclass="token operator">*class="token punctuation">)_sTxBufferclass="token punctuation">, txPacketlenghtclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
code>

回收winsocket资源

<code class="prism language-c">class="token function">closesocketclass="token punctuation">(clientSocketclass="token punctuation">)class="token punctuation">;
class="token function">closesocketclass="token punctuation">(serverSocketclass="token punctuation">)class="token punctuation">;
class="token function">WSACleanupclass="token punctuation">(class="token punctuation">)class="token punctuation">;
code>

检查连接断开情形

<code class="prism language-c">class="token keyword">int bytesReceived class="token operator">= class="token function">recvclass="token punctuation">(clientSocketclass="token punctuation">, bufferclass="token punctuation">, bufferSizeclass="token punctuation">, class="token number">0class="token punctuation">)class="token punctuation">;
class="token keyword">if class="token punctuation">(bytesReceived class="token operator">== class="token number">0class="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Client socket disconnected gracefully.\n"class="token punctuation">)class="token punctuation">;
class="token punctuation">} class="token keyword">else class="token keyword">if class="token punctuation">(bytesReceived class="token operator">== SOCKET_ERRORclass="token punctuation">) class="token punctuation">{class="token keyword">int error class="token operator">= class="token function">WSAGetLastErrorclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(error class="token operator">== WSAECONNRESETclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Client socket disconnected unexpectedly.\n"class="token punctuation">)class="token punctuation">;class="token punctuation">} class="token keyword">else class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Recv failed with error: %d\n"class="token punctuation">, errorclass="token punctuation">)class="token punctuation">;class="token punctuation">}
class="token punctuation">}
code>
class="blog-extension-box">

http://www.ppmy.cn/news/1571859.html

相关文章

javaEE-9.HTML入门

目录 一.什么是html 二.认识html标签 1.标签的特点: 2.html文件基本结构 3.标签的层次结构 三、html工具 四、创建第一个文件 五.html常见标签 1标题标签h1-h6 2.段落标签:p 3.换行标签:br 4.图片标签:img 图片路径有1三种表示形式: 5.超链接:a 链接的几种形式: …

迷宫(信息学奥赛一本通-1215)

【题目描述】 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由nn的格点组成&#xff0c;每个格点只有2种状态&#xff0c;.和#&#xff0c;前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时&#xff0c;他只能移动到东南西北(或…

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存&#xff08;VRAM&#xff09; 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具&#xff0c;其主要作用包括但不限于以下几点&#…

主机安全:数字时代的基石

在数字化转型的浪潮中&#xff0c;主机安全已成为企业信息安全体系中最关键的防线。主机作为企业数据存储、应用运行的核心载体&#xff0c;承载着企业最重要的数字资产。每一次网络攻击事件的发生&#xff0c;都在警示我们&#xff1a;主机安全不仅关乎数据安全&#xff0c;更…

【开源项目】数字孪生武汉~超经典智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码

飞渡科技数字孪生武汉CIM管理平台&#xff0c;基于自研数字孪生引擎&#xff0c;结合数字孪生、物联网IOT、云计算等信息技术&#xff0c;以城市数据资源融合共享为主线&#xff0c;打造感知、联结、计算、运用“四位一体”的城市大脑&#xff0c;赋能经济社会高质量可持续发展…

vue2和vue3储存组件

在 Vue.js 中&#xff0c;组件是构建用户界面的核心单元。无论是 Vue 2 还是 Vue 3&#xff0c;组件的基本概念和使用方式都比较相似&#xff0c;但在实现细节和性能优化方面&#xff0c;Vue 3 有了一些改进。以下是对 Vue 2 和 Vue 3 中组件的简单说明&#xff0c;包括它们的存…

在 Go 中实现事件溯源:构建高效且可扩展的系统

事件溯源&#xff08;Event Sourcing&#xff09;是一种强大的架构模式&#xff0c;它通过记录系统状态的变化&#xff08;事件&#xff09;来重建系统的历史状态。这种模式特别适合需要高可扩展性、可追溯性和解耦的系统。在 Go 语言中&#xff0c;事件溯源可以通过一些简单的…

河北某石油管廊自动化监测

1. 项目简介 近年来&#xff0c;国家密集出台油气管道建设相关政策和规划引导中国油气管道加快建设&#xff0c;2017年&#xff0c;在《中长期油气管网规划》中对2025年和2030年油气管道发展目标均作出了相应的规划目标。另一方面&#xff0c;随着油气管道行业的发展&#xff…