服务器端WSAAsyncSelect模型编程

WinSock I/O 模型 -- WSAAsyncSelect 模型 简介 WSAAsyncSelect 模型也是 WinSock 中常见的异步 I/O 模型。 使用这个模型,网络应用程序通过接收以 Windows 消息为基础的网络事件通知来处理网络请求。 这篇文章我们就来看看如何使用 WSAAsyncSelect api 来实现一个简单的 TCP 服务器. API 基础 要使用 WSAAsyncSelect 模型,我们必须创建一个窗口, 再为该窗口对象提供一个窗口历程(WinProc). 通过适当的配置之后,当有网络请求到来的时候,windows 会将网络消息投递到我们所创 阅读详情

WSAAsyncSelect是服务器端的六种I/O模型之一,他的主要思想是运用了windows窗口的消息机制,用函数WSAAsyncSelect()将监听端口感兴趣的网络消息注册到窗口,然后在窗口的消息过程中处理,该模型只提供异步通知,并不提供异步数据传送,只适用于系统开销不大的情况。

使用该模型编程,需要基于窗口,以下CreateServerWindow提供了创建窗口的过程。

#include <cassert>
#include <iostream>
#include "ServerWindowCreator.h"
#include "SocketUtil.h"

HWND ServerWindowCreator::CreateServerWindow(HINSTANCE hInstance, LPCTSTR wndClass, WNDPROC wndProc)
{
	assert(hInstance);
	assert(wndClass);
	assert(wndProc);
	if(!hInstance || !wndClass || !wndProc)
		return NULL;

	HWND hWnd = NULL;
	if (MyRegisterClass(hInstance, wndClass, wndProc))//注册窗口类
		hWnd = InitInstance(hInstance, wndClass);//创建窗口

	return hWnd;
}

bool ServerWindowCreator::MyRegisterClass(HINSTANCE hInstance, LPCTSTR wndClass, WNDPROC wndProc)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= 0;
	wcex.lpfnWndProc	= wndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= NULL;
	wcex.hCursor		= NULL;
	wcex.hbrBackground	= NULL;
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= wndClass;
	wcex.hIconSm		= NULL;

	ATOM ret = RegisterClassEx(&wcex);
	assert(ret!=NULL || ::GetLastError()==ERROR_CLASS_ALREADY_EXISTS);
	return ret!=NULL || ::GetLastError()==ERROR_CLASS_ALREADY_EXISTS;
}

HWND ServerWindowCreator::InitInstance(HINSTANCE hInstance, LPCTSTR wndClass)
{
	HWND hWnd = CreateWindow(wndClass, NULL, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, 0, 0, NULL, NULL, hInstance, NULL);
	
	assert(hWnd);
	if(!hWnd)
	{
		DWORD dwError = GetLastError();
		std::cout<<"create server window failed"<<std::endl;
	}

	return hWnd;
}


服务器端的通信过程

#include "SocketUtil.h"
#include "ServerWindowCreator.h"
#include "ServerSourceHolder.h"
#include "ServerParamDef.h"
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance, LPSTR lpCmdLine,
	int nCmdShow)
{
	ServerHolder skHoder;//该对象负责管理winsock库的初始化和清理,监听socket的释放,窗口的资源和消息管理
	if (!skHoder.Init())
		return 0;

	SOCKET skListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建监听socket
	if (skListen == INVALID_SOCKET)
	{
		RecordSocketError("create listen socket failed");
		return 0;
	}
	std::cout<<"listen socket = "<<skListen<<std::endl;
	skHoder.HoldSocketFd(skListen);

	sockaddr_in addr;
	memset(&addr, NULL, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	addr.sin_port = htons(SERVER_PORT);
	if (bind(skListen, (sockaddr*)&addr, sizeof(addr)))//将socket与地址绑定
	{
		RecordSocketError("bind address failed");
		return 0;
	}

	const TCHAR* WINDOW_CLASS = _T("ServerWindow");//创建窗口
	HWND hWnd = ServerWindowCreator::CreateServerWindow(hInstance, WINDOW_CLASS, 
		ServerHolder::ServerWndProc);
	if (!hWnd || !::IsWindow(hWnd))
		return 0;

	skHoder.HoldWindow(hWnd);

	if (WSAAsyncSelect(skListen, hWnd, WM_SOCKET,
		FD_ACCEPT | FD_CLOSE | FD_WRITE) != 0)//注册网络消息
	{
		RecordSocketError("set socket error");
		return 0;
	}

	if (listen(skListen, MAX_PENDING_CONN) != 0) //开始监听
	{
		RecordSocketError("listen error");
		return 0;
	}

	std::cout<<"start server ..."<<std::endl;
	ServerHolder::ServerMessageLoop();//进入窗口消息循环

	return 0;
}


WSAAsyncSelect模型的基础编程可以参考《windows网络编程第二版》,里面有比较详细的介绍。

Winsock编程基础介绍 . 相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Winsock API来写网络应用程序,但是,要写出优秀的网络应用程序,还是必须对TCP/IP协议有一些了解的. 1. TCP/IP协议与Winsock网络编程接口的关系. 在开始之前,我们先说一 阅读详情

相关推荐

【STM32Cube HAL】输入捕获(六)——脉宽测量

1

HAHAHA 4907

通信编程:WSAAsyncSelect 模型通信

异步选择(WSAAsyncSelect)

qq_55777599的博客 1912

Ubuntu环境下读取罗技G29方向盘信息

Ubuntu环境下读取罗技G29方向盘信息

工大机器人工作室 3461

windows套接字I/0模型-WSAAsyncSelect 模型

其中,hwnd 是窗口句柄,WM_SOCKET 是自定义的消息类型,FD_READ 表示套接字上有可读数据,FD_WRITE 表示套接字可写,FD_CLOSE 表示套接字已关闭,FD_CONNECT 表示套接字连接已建立。WSAAsyncSelect 函数的第一个参数是套接字的句柄,第二个参数是窗口句柄,第三个参数是一个整数,表示需要监听的网络事件,第四个参数是错误代码。(2)回调函数的第一个参数是窗口句柄,第二个参数是消息类型,第三个参数是套接字句柄,第四个参数是网络事件类型,第五个参数是错误代码。

ai agent 1061

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1902

Telegram 担保交易系统搭建指南:安全可靠的交易流程实现

本文介绍了基于Telegram Bot API搭建担保交易系统的完整方案。该系统通过第三方资金托管机制解决买卖双方信任问题,支持"付款后发货"和"收货后放款"的交易流程。文章详细阐述了系统架构设计,包括Telegram Bot交互层、后端业务逻辑层、数据库层和支付接口层。核心实现步骤涵盖:1)订单创建模块处理交易信息;2)支付处理模块集成Stripe Escrow实现资金托管;3)确认收货模块完成资金划转。系统采用PostgreSQL存储交易数据,并通过FastAPI

jingpide9527的博客 1947

网络程序设计——异步选择模型(基于消息的选择、基于事件的选择)

共同特点:不管 I/O事件是否发生,应用程序都会按既定流程主动试着进行I/O操作,而且直至操作成功才会罢休,因此这三种套接字模型都属于。尽管非阻塞模型和Select模型一次能够尝试对多个套接字进行I/O操作,要比阻塞模型效率高很多,但应用程序一旦开始I/O操作,则I/O操作完成之前都是无法进行其它操作。WSAAsyncSelect模型和WSAEventSelect模型都属于异步I/O模型,二者的差别在于。

x20020402的博客 1911

基因组研究之单倍型T2T基因组(一)

单倍型T2T基因组(Haplotype-resolved T2T genome)是一种高精度、高连续性、高完整性的基因组组装技术,它能够提供从端粒到端粒的完整基因组序列,包括所有的基因和非编码序列。完整覆盖:T2T基因组覆盖从端粒到端粒的染色体序列,包含所有的基因和非编码序列,包括以往难以解析的端粒和着丝粒区域。单倍型解析:单倍型T2T基因组能够区分来自父母本的遗传信息,进行亚基因组不对称演化研究,挖掘单倍型等位基因间的表达差异,这对于重测序、性状定位、进化、基因功能、基因编辑等研究至关重要。

2401_89507557的博客 2438

「 C++ 函数 」“WSAAsyncSelect()使用”讲解

一.前言 WSAAsyncSelect()函数允许应用程序以Windows消息的方式接收网络事件通知。 二.讲解 1.函数的功能 WSAAsyncSelect()函数 WSAAsyncSelect()函数自动把套接字设为非阻塞模式,并且为套接字绑定一个窗口句柄,当有网络事件发生时,便向这个窗口发送消息。 2.函数使用 ...

Robot_Starscream的博客 2714

【具身智能】感知 × 决策 × 执行:一个智能体的认知闭环怎么搭?

构建一个真正能在现实世界中运作的具身智能体,并不是简单地拼接“视觉 + 控制器 + 动作模块”就能完成的,它必须是一个**认知闭环结构**:能感知环境、理解状态、制定策略、执行动作,并从结果中学习反馈。 本讲将深入剖析具身智能的三大核心支柱:**感知系统、决策系统、执行系统**,并解析它们如何协同构建出一个“能观察、能思考、能行动”的智能体。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3262

作为专家系统与应用的审稿人:提醒你投稿注意事项

本文为《专家系统与应用》(ESWA)期刊投稿指南,重点强调研究方向匹配性、学术质量和写作规范。要求论文以智能系统/算法为核心,突出增量创新并具可验证性,需包含严谨方法论和充分实验验证。写作需结构清晰,符合期刊格式要求,包括明确的研究问题、分类文献综述、详细技术实现和量化结果。投稿前需仔细核对期刊指南,引用相关文献,并妥善处理审稿意见。ESWA注重创新实质性和应用落地价值,建议突出智能系统设计核心,避免成为单纯技术应用描述。

ZhangJiqun&191cm&85kg 1799

实验六:基于 WSAAsyncSelect模型的 Socket 编程

1.掌握非阻塞模式编程方法;2.掌握基于模型的高级编程技术。

2404_87712883的博客 817

若依框架二次开发——若依 Vue3 版本前端样式优化指南

若依框架二次开发——若依 Vue3 版本前端样式优化指南

bjzhang75的博客 1692

基于WSAAsyncSelect模型的服务端设计MFC资源下载:助力高效网络编程

基于WSAAsyncSelect模型的服务端设计MFC资源下载:助力高效网络编程 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 基于WSAAsyncSelect模型的服务端设计MFC资源下载是一个专门为Windows平台开发者设计的教程资源。该资源利用MFC框架,深入浅出地介绍了如何在Visual Studio 2017环境下,运用WSAAsyncSelect模型进行...

gitblog_06753的博客 284

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

WSAAsyncSelect函数模型

   以前学习的时候,看到select模型。说可以跨平台,哇,觉得真的很不错,学了它我可以在WINDOWS上和UNIX上都可以编程了。该模型就是神啊。其实,一直在犯一个错误。大多数时候,编程都是基于某一个平台的,而起某些基于某一平台的东西往往在效率上要比那些非专业的要强一些。select在WINDOW中的所有网络模型中,其效率应该算最低的了。恩,以前我还一直拿着不放呢。跨平台,多好啊,但是只是自己

走出憧憬的专栏 2532

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WSAAsyncSelect 模型

WSAAsyncSelect模型是winsock编程模型的一种,它提供了socket异步编程的方便,其实现是基于Windows消息机制的,最主要的就是下面这个函数: 1 int PASCAL FAR WSAAsyncSelect (SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent); s 标识一个需要事件通知的套接口的描述符.hWnd 标...

weixin_33860528的博客 169

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Winsock API 编程介绍

Winsock API 编程介绍作者:太子email: tablejiang@21cn.compage:  http://wolfftp.51.net相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API.使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Winsock API来写网络应用程序,但是,要写出优秀的

ncdawen的专栏 1557

基于WSAAsyncSelect模型的服务端设计(MFC)资源下载

基于WSAAsyncSelect模型的服务端设计(MFC)资源下载 去发现同类优质开源项目:https://gitcode.com/ 资源简介 此资源为使用MFC(Microsoft Foundation Classes)框架构建的服务器端设计教程,重点展示了如何在VS2017环境下利用WSAAsyncSelect模型进行Socket通信的简单编程。 特点 界面友好:设计简洁直观,易于用户操作。...

gitblog_06776的博客 357

MFC- socket 编程

一、CAsyncSocket类 CAsyncSocket属于异步非阻塞类。 CAsyncSocket类采用了windows socket中的WSAAsyncSelect模型。CAsyncSocket 类是在很低的层次上对windows socket API进行了封装,它的成员函数和winsock API的函数调用直接对应,一个CAsyncSocket对象代表了一个windows套接字,它是网络...

weixin_30823001的博客 285

DELPHI下的Socket编程

DELPHI下的Socket编程(转自http://www.cnblogs.com/devcjq/articles/2325600.html) 本文是写给公司新来的程序员的,算是一点培训的教材。本文不会涉及太多的编程细节,只是简单讲解在DELPHI下进行Winsock编程最好了解的知识。 题外话:我认为学习编程就如同学习外语一样,最好的方式是你先学会如何去运用它...

669

基于WSAAsyncSelect模型的服务端和客户端设计(MFC)

目录1 效果展示1.1 服务器和客户端界面展示1.2 一对一之间通信的功能展示1.3 一对多之间通信的功能展示2 知识预备2.1 WSAAsyncSelect模型介绍2.2 WSAAsyncSelect模型的过程图2.3 与SELECT模型比较2.4 套接字WSAAsyncSelect模型实现2.5 网络事件种类2.6 WSAAsyncSelect模型的优势和不足3 代码展示3.1 服务端3.1.1 定义变量3.1.2 初始化界面3.1.3 启动服务器3.1.4 消息响应3.1.5 发送消息3.1.5 断开

weixin_45984283的博客 4544

Socket网络编程之WSAAsyncSelect模型

使用异步选择模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用WSAAsyncSelect函数。 服务器端代码: C++代码 // write by larry   // 2009-8-20    // This is a server using WSAAsyncSelect model.   #include

嗯.的专栏 1355

基于WSAAsyncSelect模型的两台计算机之间的通信

任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递。客户端向服务器端发送“请输出从1到1000内所有的质数”,服务器回应客户端给出结果。 效果图 核心代码 服务器端: #include <stdio.h> #include <winsock2.h> #pragma com...

波士地盘 634
上一篇: 基于TCP的简单socket通信
下一篇: centos中设置redis开机启动
sunchenxian017
博客等级 码龄16年 2粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值