MFC socket编程-服务端和客户端流程

MFC 提供了一套丰富的类库来简化 Windows 应用程序的网络编程。以下是使用 MFC 进行 socket 编程时服务端和客户端的基本流程:

服务端流程:

  1. 初始化 Winsock
    调用 AfxSocketInit 初始化 Winsock 库。

  2. 创建 CSocket 或 CAsyncSocket 对象
    创建一个 socket 对象用于监听连接。

  3. 绑定地址
    使用 Bind 方法将 socket 绑定到一个本地地址和端口。

  4. 监听连接
    调用 Listen 方法开始监听进入的连接请求。

  5. 接受连接
    使用 Accept 方法接受客户端的连接请求,创建一个新的 socket 用于与客户端通信。

  6. 数据交换
    使用 Send 和 Receive 方法与客户端进行数据交换。

  7. 关闭连接
    使用 Close 方法关闭与客户端的连接。

  8. 清理 Winsock
    调用 WSACleanup 清理 Winsock 库。

客户端流程:

  1. 初始化 Winsock
    同服务端。

  2. 创建 CSocket 或 CAsyncSocket 对象
    创建 socket 对象用于发起连接。

  3. 连接到服务端
    使用 Create 方法创建 socket,并使用 Connect 方法连接到服务端。

  4. 数据交换
    使用 Send 和 Receive 方法与服务端进行数据交换。

  5. 关闭连接
    使用 Close 方法关闭连接。

  6. 清理 Winsock
    同服务端。

示例代码:

服务端示例:
// CServerSocket 类
class CServerSocket : public CAsyncSocket
{
public:CServerSocket() {if (!AfxSocketInit())AfxThrowSocketException(WSAEINITIALIZATION_FAILED);}void StartServer(unsigned short nPort) {if (!Bind((SOCKADDR_IN){AF_INET, htons(nPort), INADDR_ANY})) {AfxThrowSocketException(WSAGetLastError());}if (!Listen()) {AfxThrowSocketException(WSAGetLastError());}}CAsyncSocket* Accept() {CAsyncSocket* pSocket = AcceptEx(m_hSocket, NULL, NULL, NULL, NULL, NULL, NULL);if (pSocket) {pSocket->SetSockOpt(SO_UPDATE_ACCEPT_CONTEXT, &m_hSocket, sizeof(m_hSocket));}return pSocket;}
};// 在应用程序中使用
CServerSocket serverSocket;
serverSocket.StartServer(8888);
while (true) {CAsyncSocket* clientSocket = serverSocket.Accept();// 处理客户端连接...
}
客户端示例:
// CClientSocket 类
class CClientSocket : public CAsyncSocket
{
public:CClientSocket() {if (!AfxSocketInit())AfxThrowSocketException(WSAEINITIALIZATION_FAILED);}void ConnectToServer(const CString& strServer, UINT nPort) {SOCKADDR_IN sockAddr = {AF_INET, htons(nPort), inet_addr(strServer)};if (!Create() || SOCKET_ERROR == Connect(sockAddr)) {AfxThrowSocketException(WSAGetLastError());}}
};// 在应用程序中使用
CClientSocket clientSocket;
clientSocket.ConnectToServer("127.0.0.1", 8888);
// 发送和接收数据...
clientSocket.Close();

注意事项:

  • 服务端的 AcceptEx 函数是 Windows 特有的,用于高效地接受大量连接。
  • 客户端示例中使用了 inet_addr 将点分十进制地址转换为网络字节顺序的整数。
  • 错误处理在网络编程中非常重要,示例中省略了详细的错误处理代码。
  • 确保服务器端和客户端的端口号一致,并且服务器端的IP地址正确。

MFC 的网络类库提供了对底层 Winsock API 的封装,使得网络编程变得更加简单和直观。

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

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

相关文章

汇编:保护模式下的寻址方式

寻址(Addressing)是计算机在访问内存时定位数据的过程;它涉及如何指定内存位置,以便处理器能够正确地读取和写入数据,不同的计算机架构和操作模式支持多种不同的寻址方式。以下是常见的寻址方式: ①立即数…

强烈推荐的JetBrains家族的插件

Rainbow Brackets 该插件提供了不同颜色的对应的括号格式,便于在开发中检查缺少括号的情况,效果如下 CodeGlance Pro 该插件是代码缩略图插件,方便在开发中快速定位代码位置,也可作为滚动条使用,CodeGlance Pro搜不到…

webpack插件

plugin 插件向第三方开发者提供了 webpack 引擎中完整的能力。使用阶段式的构建回调,开发者可以引入它们自己的行为到 webpack 构建流程中。创建插件比创建 loader 更加高级,因为你将需要理解一些 webpack 底层的内部特性来做相应的钩子 为什么需要一个…

(Git)多人协作1

文章目录 前言总结 前言 目标:master分支下file.txt文件新增“aaa”,“bbb” 实现:开发者1新增“aaa”,开发者2新增“bbb” 条件:在同一个分支下协作完成 实际开发过程中,每个用户都与属于自己的码云账户,如果想要进…

windows安装SQLyog

windows安装SQLyog 1. 下载 SQLyog 安装包 访问 SQLyog 的官方网站。在网站上找到下载链接,通常会有一个“Download”或“Try Now”按钮。如果需要注册或填写信息以获取下载链接,请按提示操作。 2. 运行安装程序 下载完成后,双击运行下载…

css设置滚动条样式;滚动条设置透明

滚动条透明代码 .resizable-div {resize: both;/* 允许水平和垂直调整大小 */overflow: auto;/* 确保内容超出边界时出现滚动条 */ } /* 滚动条整体样式 */ .resizable-div::-webkit-scrollbar {width: 4px; /* 竖直滚动条宽度 */height: 4px; /* 水平滚动条高度 */ }/* 滚动条…

湖州等保测评公司有几家?在那里?电话多少?

湖州等保测评公司有几家?在那里?电话多少? 【回答】:目前湖州暂未有正规等保测评机构。因此湖州企业可以就近选择浙江省内正规等保测评机构,有可以网上寻找合适的等保测评机构。 知识拓展1:浙江正规等保测…

Python学习笔记6:pychram相关知识及安装教程,后续需要学习的入门知识

上篇文章说了,今天去公司重新装一下IDE,最后也是把过程这边再记录一下,有需要的可以参考一下。 关于pychram pychram是什么? PyCharm是由JetBrains公司开发的一款流行的Python集成开发环境(IDE)。它专为…

Linux C/C++ socket

一、第一个网络通讯程序 网络通讯是指两台计算机中的程序进行传输数据的过程客户程序(端):指主动发起通讯的程序。服务程序(端/器):指被动的等待,然后为向它发起通讯的客户端提供服务。 /** 程序名:demo1.cpp,此程序用于演示socket的客户端…

洛谷P1305 新二叉树(树的基本遍历)

题目描述 输入一串二叉树,输出其前序遍历。 输入格式 第一行为二叉树的节点数 𝑛。(1≤𝑛≤26) 后面 𝑛 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点…

Apollo9.0 PNC源码学习之Control模块(一)—— 控制模块概览

0 前言 从planning的角度看control,首先需要了解的就是相关的数据接口,规划出的轨迹(路径+速度)发给Control模块去执行 modules/planning/planning_component/planning_component.cc planning模块发布轨迹信息 planning_writer_ = node_->CreateWriter<ADCTrajecto…

60行代码加速20倍: NEON实现深度学习OD任务后处理绘框

【前言】 本文版权属于GiantPandaCV&#xff0c;未经允许&#xff0c;请勿转载&#xff01; 最近在学neon汇编加速&#xff0c;由于此前OD任务发现在检测后处理部分使用OpenCV较为占用资源且耗时&#xff0c;遂尝试使用NEON做后处理绘框&#xff0c;以达到加速并降低CPU资源消耗…

Linux 中 “ 磁盘、进程和内存 ” 的管理

在linux虚拟机中也有磁盘、进程、内存的存在。第一步了解一下磁盘 一、磁盘管理 &#xff08;1.1&#xff09;磁盘了解 track&#xff08; 磁道 &#xff09; &#xff1a;就是磁盘上的同心圆&#xff0c;从外向里&#xff0c;依次排序1号&#xff0c;2号磁盘........等等。…

802.11中的各种帧

在无线网络中&#xff0c;802.11协议定义了三种类型的帧&#xff1a;管理帧&#xff08;Management Frames&#xff09;、控制帧&#xff08;Control Frames&#xff09;和数据帧&#xff08;Data Frames&#xff09;。每种类型的帧都有其特定的功能&#xff0c;帮助维护和管理…

QNX简述

文章目录 前言1. QNX简介1.1 什么是QNX1.2 QNX的应用场景1.3 QNX的优点1.4 QNX的发展史1.5 QNX的商业模式 2. QNX的技术特点3. QNX和其它操作系统的比较3.1 QNX VS LINUX3.2 QNX VS FreeRTOS3.3 QNX VS 鸿蒙操作系统 4. 我的疑问4.1 微内核看起来又稳定又容易调试&#xff0c;为…

【讯为Linux驱动开发】6.自旋锁spinlock

【自旋锁】 线程A获取自旋锁后&#xff0c;B假如想获取自旋锁则只能原地等待&#xff0c;仍占用CPU&#xff0c;不会休眠&#xff0c;直到获取自旋锁为止。 【函数】 DEFINE SINLOCK(spinlock t lock) 定义并初始化一个变量int spin lock init(spinlock t*lock) 初始化自…

技术速递|Java on Azure Tooling 5月更新 - Java 对 Azure 容器应用程序的入门指南支持

作者&#xff1a;Jialuo Gan 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具 5 月份更新。在本次更新中&#xff0c;我们将介绍 Java 在 Azure 上的容器应用程序的入门指南。希望您喜欢这些更新&#xff0c;并享受使用 Azure 工具包的流畅体验。请下…

Python中用pip命令用稳定的国内源安装第三方库

近期发现python中安装三方库的最稳定的方式还是用pip命令&#xff0c;带上国内源的地址。 比如清华源&#xff1a; pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple/ 用这个带国内源的格式&#xff0c;非常稳定&#xff01;

audio标签怎么使用

<audio> 标签在 HTML 中用于嵌入音频内容&#xff0c;如音乐、歌曲、音效等。这个标签允许你在网页上直接播放音频&#xff0c;而无需依赖任何外部播放器或插件&#xff08;如过去的 Flash 插件&#xff09;。 以下是如何使用 <audio> 标签的基本示例&#xff1a;…

oss一个桶中如何创建多个文件夹并在上传文件时上传到相应指定的桶中

在阿里云OSS&#xff08;Object Storage Service&#xff09;中&#xff0c;文件夹的概念实际上是一个逻辑上的概念&#xff0c;因为OSS是一个基于对象的存储服务&#xff0c;而不是基于文件系统的。但是&#xff0c;你可以通过为对象指定特定的key来模拟文件夹结构。以下是如何…