CAsyncSocket类实现网络通信

embedded/2024/9/23 6:38:42/

CAsyncSocket类编程模型

  在一个MFC应用程序中,要想轻松处理多个网 络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。CAsyncSocket类针对字节流型套接字的编程模型简述如下:

  1、构造一个CAsyncSocket对象,并用这个 对象的Create成员函数产生一个Socket句柄。可以按如下两种方法构造: 
 

CAsyncSocket sock; //使用默认参数产生一个字节流套接字
Sock.Create();


  或在指定端口号产生一个数据报套接字
 

CAsyncSocket*pSocket=newCAsyncSocket;
intnPort=27;
pSocket->Create(nPort,SOCK-DGRAM);


  第一种方法在栈上产生一个CAsyncSocket对象, 而第二种方法在堆上产生CAsyncSocket对象;第一种方法中Create()成员函数用缺省参数产生一个字节流套接字,第二种方法中用Create()成员函数在指定的端口产生一个数字报套接字。Create()函数的原型为:
 

BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL );


  该函数的参数有:

  1)端口,UINT类型。注意:如果是服务方,则使 用一个众所周知的端口供服务方连接;如果是客户方,典型做法是接受默认参数,使 套接字可以自主选择一个可用端口;

  2)socket 类型,可以是SOCK-STREAM(默认值,字节流)或SOCK-DGRAM(数据报); 

  3)socket的地址,例如"ftp.gliet.edu.cn"或"202.193.64.33"。 

  2、如是客户方程序,用CAsyncSocket∷Connect()成员函数连接到服务方;如是服务方程序,用CAsyncSocket∷Listen()成员函数开始 监听,一旦收到连接请求,则调用CAsyncSocket∷Accept()成员函数开始接收。注意:CAsyncSocket ∷Accept()成员函数要用一个新的并且是空的CAsyncSocket对象作为它的参数,这里所说 的"空的"指的是这个新对象还没有调用Create()成员函数。 

  3、调用其他的CAsyncSocket类的Receive()、ReceiveFrom()、Send()和SendTo()等成员函数进行数据通信。 

  4、通讯结束后,销毁CAsyncSocket对象。如果是在栈上产生的CAsyncSocket对象,则对象超出定义的范围时自动被析构;如果是在堆上产生,也就是用了new这个操作符,则必须使用delete操作符销毁CAsyncSocket 对象。 

  CSocket类编程模型 

  使用CSocket对象涉及CArchive和CSocketFile 类对象。以下介绍的针对字节流型套接字的操作步骤中,只有第3步对于客户方和服务方操作是不同的,其他步骤都相同。 

  1、构造一个CSocket对象。 

  2、使用这个对象的Create()成员函数产生一个socket对象。在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方程序,必须在调用Create时指定一个端口。需要注意的是,Carchive类对象不能与数据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket和CSocket 的使用方法是一样的。 

  3、如果是客户方套接字,则调用CAsyncSocket ∷Connect()函数与服务方套接字连接;如果是服务方套接字,则调用CAsyncSocket∷Listen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocket∷Accept()函数接受请求,建立连接。请注意Accept()成员函数需要一个新的并且为空的CSocket对象作为它的参数,解释同上。 

  4、产生一个CSocketFile对象,并把它与CSocket 对象关联起来。

  5、为接收和发送数据各产生一个CArchive 对象,把它们与CSocketFile对象关联起来。切记CArchive是不能和数据报套接字一起工作的。 

  6、使用CArchive对象的Read()、Write()等函数在客户与服务方传送数据。

  7、通讯完毕后,销毁CArchive、CSocketFile和


http://www.ppmy.cn/embedded/100267.html

相关文章

运维学习————nginx2-配置详解及负载均衡

目录 一、配置文件详解 1.1、结构 1.2、重要配置解释 1.3、详细配置 全局配置 Events HTTP 服务器配置 server虚拟主机配置 location URL匹配配置 1.4、完整配置 二、负载均衡 2.1、概念 2.2、集群规划及实现 2.3、具体实现 2.3.1、克隆 2.3.2、修改tomcat1配…

“学会吊打面试官系列”8.12~8.24面试难点记录

一共面了三家小公司,以下为个人记录的比较重要的10道题目 redis大key是什么问题?如何避免? “大 Key”是指那些占用大量内存的键值对。大 Key 会导致各种性能问题,比如:内存消耗增大,性能影响增大&#x…

iOS 开发:Object-C 和 Swift 的区别 (AI问答)

一:语言类型的区别(最主要区别) object-c 是动态类型语言; swift是静态类型语言; 看一下AI的回答,很全面~~ Objective-C 和 Swift 的语言类型区别主要体现在以下几个方面: 1. 静态类型 vs. 动…

微信小程序获取当前位置并自定义浮窗

1、在腾讯地图api申请key(添加微信小程序的appid)。 每个Key每日可以免费使用100次,超过次数后会导致地图不显示。可以多申请几个Key解决。WebService API | 腾讯位置服务腾讯地图开放平台为各类应用厂商和开发者提供基于腾讯地图的地理位置…

Go 语言切片(Slice)

Go 语言切片(Slice) 引言 Go 语言作为现代编程语言之一,以其简洁、高效和并发性能而受到广泛欢迎。在 Go 中,切片(Slice)是一种重要的数据结构,它提供了对数组的灵活访问。切片不仅允许开发者动态地管理数据集合,而且还提供了高效的内存使用和方便的扩展能力。本文将深…

多个fork线程与主线程或其他的pthread线程通信的例子

最近在做一个项目,需要建立两个server,一个循环检测收到的数据发送到另一个server,但是由于fork新建的线程里面的全局变量都是副本,同时fork里面还有个阻塞的循环用于处理event,所以也不能用select的方式,同…

uniapp中H5网页怎么实现自动点击事件

<template><view><button ref"myButton" click"handleClick">点击我</button></view> </template><script> export default {mounted() {this.$nextTick(() > {const button this.$refs.myButton;console.l…

C#面:在 MVC 中如何执行 Windows 认证?

在 MVC 中执行 Windows 认证可以通过以下步骤实现&#xff1a; 在 Web.config 文件中启用 Windows 身份验证。找到 <system.web> 节点&#xff0c;并确保已经添加或者设置。在 Controller 的 Action 方法上使用 [Authorize] 属性来限制只有经过 Windows 身份验证的用户才…