.基于事件套接字集合的select模型

WinSock三种选择I/O模型 在《套接字socket及C/S通信的基本概念》和《WinSock编程基础》中,我们介绍了套接字的基本概念和WinSock API的基本调用规范。我们讨论了阻塞模式/非阻塞模式和同步I/O和异步I/O等话题。 从概念的角度,阻塞模式因其简洁易用便于快速原型化,但在应付建立连接的多个套接字或在数据的收发量不均、时间不定时却极难管理。另一方面,我们需要对非阻塞模式套接字的 WinSock API调用频 阅读详情

1.基于事件套接字集合的select模型

select(选择)模型是Winsock中最常见的I/O模型。之所以称其为“select模型”,是由于它的“中心思想”便是利用select函数,实现对I/O的管理!最初设计该模型时,主要面向的是某些使用Unix操作系统的计算机,它们采用的是Berkeley套接字方案。select模型已集成到Winsock 1.1中,它使那些想避免在套接字调用过程中被无辜“锁定”的应用程序,采取一种有序的方式,同时进行对多个套接字的管理。

select模型本质上是一种分类处理思想,预先声明几个FD_SET(fd_set结构)集合,例如ReadSet,WriteSet,然后调用宏FD_SET(s,&ReadSet)将关注FD_READ事件的套接字s添加到ReadSet集合,调用宏FD_SET(s,&WriteSet)将关注FD_WRITE事件的套接字s添加到WriteSet集合。其中宏FD_SET(SOCKET s, fd_set set)将s添加到set集合。从根本上说,fd_set数据类型代表着一系列按关注事件分类的套接字集合。

然后再调用select函数,对声明的集合ReadSet或WriteSet进行扫描,其函数原型如下:

WINSOCK_API_LINKAGE int WSAAPI

select(

int nfds,

        fd_set FAR * readfds,

        fd_set FAR * writefds,

        fd_set FAR *exceptfds,

        const struct timeval FAR * timeout );

其中,第一个参数 nfds会被忽略,一般赋值0。之所以仍然要提供这个参数,只是为了保持与早期的Berkeley套接字应用程序的兼容。

其他的三个fd_set参数,一个用于检查可读性(readfds),一个用于检查可写性(writefds),另一个用于例外数据(exceptfds)。例如我们只关注FD_READ事件,则select(0,&ReadSet,NULL,NULL,NULL)。一般来说,这三个fd_set参数至少有一个不为NULL。

调用select会修改每个fd_set结构,它扫描注册到集合ReadSet和WriteSet中的套接字是否有读写事件发生,若有,则对集合进行更新,即将套接字添加到集合ReadSet和WriteSet中。同时,删除那些不存在待决I/O操作的套接字句柄。select完成后,会返回在所有fd_set集合中设置的套接字句柄总数。

然后,我们需要遍历查询之前注册到某个集合中的套接字是否仍为其中一部分。这需要调用FD_ISSET(SOCKET s, fd_set set)来测试套接字是否属于关注同类事件的套接字集合set。若是,则对待决的I/O进行处理。

使用select模型,可能需要调用ioctlsocket函数将一个套接字从锁定模式切换为非锁定模式。

 

2.基于Windows消息处理WSAAsyncSelcet模型

Winsock提供了一个有用的异步I/O模型。利用这个模型,应用程序可在一个套接字上,

接收以Windows消息为基础的网络事件通知。具体的做法是在创建好一个套接字后,调用

WSAAsyncSelect函数,它的函数原型如下:

WINSOCK_API_LINKAGE int WSAAPI

WSAAsyncSelect(

SOCKET s,

HWND hWnd,

u_int wMsg,

long lEvent);

这个函数完成的功能是,将参数一所指定的套接字s(包括监听套接字和会话套接字)上感兴趣的一系列网络事件以位或|掩码组合形式(FD_XXX | FD_XXX)注册到参数四lEvent,然后将lEvent中的网络事件通知绑定到参数二指定的窗口hWnd和参数三指定的自定义消息wMsg进行处理。

对于标准的Windows例程(常称为“WindowProc”),这个模型充分利用了Windows窗口消息处理机制。该模型亦得到了MFC(Microsoft Foundation Class,微软基础类库)对象CSocket的采纳。

由于使用Windows消息机制,故要想在应用程序中使用WSAAsyncSelect模型,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口过程处理函数(WindowProc)。然后在WindowProc中读取自定义的WM_SOCKET消息内容,针对不同的网络事件进行相关处理。

网络事件消息的wParam参数为对应发生该事件的套接字句柄,lParam参数的高字位(一般用WSAGETSELECTERROR宏取得HIWORD)包含出错码,lParam参数的低字位(一般用WSAGETSELECTEVENT宏取得LOWORD)则标识了网络事件代码(FD_XXX)。一般先检查高位,再检查低位进行网络事件的处理。

 

3.基于事件通知的WSAEventSelect模型

在WSAAsyncSelcet模型中,当利用WSAAsyncSelect函数将套接字及其关注的网络事件绑定到一个窗口消息后,当有网络事件发生时,窗口会发出消息通知。我们还可以使用一种基于事件对象传信状态来发出网络事件通知的WSAEventSelect模型。

首先调用与WSAAsyncSelect同工的WSAEventSelect函数,其原型如下:

WINSOCK_API_LINKAGE int

WSAAPI WSAEventSelect(

SOCKET s,

        WSAEVENT hEventObject,

        long lNetworkEvents );

调用WSAEventSelect函数将指定参数一指定的套接字s关注的网络事件以位或|掩码组合形式(FD_XXX | FD_XXX)注册到参数三lNetworkEvents,并将该套接字绑定到参数二指定的事件对象hEventObject。这样当lNetWorkEvents中的事件发生时,Windows将hEventObject置信(由Unsignaled变为Signaled)。

当事件对象受信后,我们需要获得这个通知。需要调用等待事件对象的同步函数,主要有WaitForSingleObject、WaitForMultipleObjects和WSAWaitForMultipleEvents。

函数WaitForSingleObject定义如下:

WINBASEAPI DWORD WINAPI

WaitForSingleObject(

HANDLE hHandle,

DWORD dwMilliseconds );

对于函数WaitForSingleObject,如果超过参数二dwMilliseconds设定的时限,函数返回WAIT_TIMEOUT;在限定时限内,只有当其等待的对象受信(例如线程返回,事件受信等)后,该函数才返回,返回值为WAIT_OBJECT_0,此时,Windows将自动重置该对象。   

函数WaitForMultipleObjects定义如下:

WINBASEAPI DWORD WINAPI

WaitForMultipleObjects(

        DWORD nCount,

        CONST HANDLE *lpHandles,

        BOOL bWaitAll,

        DWORD dwMilliseconds );

    WinSock中的WSAWaitForMultipleEvents函数原型如下:

WINSOCK_API_LINKAGE DWORD WSAAPI

WSAWaitForMultipleEvents(

        DWORD cEvents,

        const WSAEVENT FAR * lphEvents,

        BOOL fWaitAll,

        DWORD dwTimeout,

        BOOL fAlertable);

和WaitForSingleObject不同的是,WaitForMultipleObjects和WSAWaitForMultipleEvents支持在多个对象的等待。它们支持nCount/cEvents和lpHandles/lphEvents参数定义了由HANDLE/WSAEVENT对象构成的一个数组。在这个数组中,nCount/cEvents指定的是事件对象的数量,而lphEvents对应的是一个指针,用于直接引用该数组。要注意的是,WaitForMultipleObjects/WSAaitForMultipleEvents只能支持由MAXIMUM_WAIT_OBJECTS/WSA_MAXIMUM_WAIT_EVENTS对象规定的一个最大值,在此定义成64个。因此,针对发出WSAWaitForMultipleEvents调用的每个线程,该I/O模型一次最多都只能支持64个套接字。假如想让这个模型同时管理不止64个套接字,必须创建额外的工作者线程,以便等待更多的事件对象。

 

WSAWaitForMultipleEvents的最后一个参数是fAlertable,在我们使用WSAEventSelect模型的时候,它是可以忽略,常设为FALSE,该参数主要用于重叠I/O的完成例程处理模型中使用。其他参数意义同WaitForMultipleObjects。

参数一指定了对象个数,参数二则往往是一个对象数组。同样,若超过参数四设定的时限,它们都会返回WSA_WAIT_TIMEOUT。在设定时限内,若参数三WaitAll = FALSE,则只要其等待的事件对象中有一个受信,该函数即返回WAIT_OBJECT_i(i=[0,nCount-1])或WSA_WAIT_EVENT_i(i=[0,cEvents-1]);若WaitAll = TRUE,则要等到所有对象都受信后该函数才返回。直到所有等待的对象都受信,系统才将所有受信事件对象状态重置(由Signaled变为Unsignaled)。应用程序往往根据返回的索引(相对预定义其实索引)使用switch-case分发流程处理不同的事件。对于多个事件,往往WaitAll被设置成FALSE,这样只要有事件发生就及时处理。

调用WSAWaitForMultipleEvents返回受信事件对象的索引,根据索引也可以知道其对应的套接字。因为在实际程序中,一个套接字绑定一个事件对象:Socket[index]ßàWSAEvent[index]。

在Windows消息机制处理Winsock事件中,有网络事件发生时,Windows根据消息号取出消息内容进行处理。在事件通知模型中,当调用WSAWaitForMultipleEvents接到和消息通知对应的事件通知后,就需要查获发生的网络事件(类比消息内容)。WSAEnumNetworkEvents函数负责查获一个套接字上发生的网络事件,其原型如下:

WINSOCK_API_LINKAGE int WSAAPI  

WSAEnumNetworkEvents(

SOCKET s,

        WSAEVENT hEventObject,

        LPWSANETWORKEVENTS lpNetworkEvents );

传递套接字参数s,当然这里是上一步中WSAWaitForMultipleEvents 返回的Index对应的socket,调用WSAEnumNetworkEvents函数来获取套接字s上所发生的事件,并将其保存到lpNetworkEvents结构中。

hEventObject参数则是可选的;它指定了一个事件句柄,对应于打算重设的那个事件对象。当然,如果设置该值,应该为上一步中WSAWaitForMultipleEvents 返回的Index对应的socket绑定的hEventObject。由于事件对象处在一个“已传信”(Signaled)状态,所以可将它传入,让Windows将其重置为“未传信”(Unsignaled)状态。如果不想用hEventObject参数,那么必须调用WSAResetEvent函数来重置事件对象。

将发生的网络事件存储在lpNetworkEvents结构中之后,接下来就需要针对事件进行处理(类比WindowProc中的消息处理)。WSANETWORKEVENTS数据结构定义如下:

typedef struct _WSANETWORKEVENTS {

        long lNetworkEvents;

        int iErrorCode[FD_MAX_EVENTS];

} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

其中参数一lNetworkEvents存放着套接字s上发生的所有网络事件。与注册事件时使用位或|掩码相反,这里一般采用位与&析取相应的网络事件代码,即将lNetworkEvents与FD_XXX进行位与运算,若返回1则表示有FD_XXX网络事件发生。

这里,我们看到了FD_ISSET的影子。可以看出,WSAEventSelect是select模型和WSAAsyncSelect模型的综合。这个模型中,每个Socket都有一个事件对象,当有网络事件发生时,与窗口消息相对应的事件对象受信,然后遍历该事件对象对应的套接字上发生的网络事件。

而select中是对socket按事件进行分类处理,通过FD_ISSET判断socket是否属于某个FD_SET。

参数二iErrorCode指定的是一个错误代码数组,同lNetworkEvents中的事件关联在一起。针对每种网络事件,都存在着一个特殊的事件索引,名字与事件类型的名字类似,只是要在事件名字后面添加一个“_BIT”后缀字串即可。例如,对FD_READ事件类型来说,iErrorCode数组的索引标识符便是 FD_READ_BIT,若无错误,其值为0。下述代码片断针对FD_READ事件的处理对此进行了阐释:

 

 

{

// 错误发生

            if(NetworkEvents.iErrorCode[FD_READ_BIT] != 0))

{

           printf("FD_READ failed with error %d/n", NetworkEvents.iErrorCode[FD_READ_BIT]);

}

// 处理FD_READ事件

……

}

另外,由于监听套接字的特殊性,往往利用一个事件对象来专门通知监听套接字上客户端接入事件。当有客户端请求接入(connect)时,accept返回时,我们可以调用WSASetEvent将事件置信,再调用WSAWaitForMultipleEvents获取通知,再做一些处理。有时需要主动调用WSAResetEvent即时重置事件对象,以便使其进入下一轮询。

 

参考:

《Network Programming for Microsoft Windows》  Anthony Jones,Jim Ohlund

if((NetworkEvents.lNetworkEvents & FD_READ)

 

分离与合体题解(区间DP) 题目: 经过在机房里数日的切磁,LYD从社神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试 杜神牛造了个区域,它们紧邻着排成了一行,编号1-n。在这經个区域里都放着一把OI界 的金钥匙,每一把都有一定的价值,LYD当然想得到它们了。然而杜神牛规定LYD不可以一下子 把它们全部拿走,而是每次只可以拿一把。为了尽快地拿到所有的金钥匙,LYD自然就用上了刚学的分离与合体特技。 开始LYD可以选择从1~n-11~n-11~n-1的任何一个区域(记为K)进入,进入后LYD会在K区域发 生分离,从而分离为两个小L 阅读详情

相关推荐

高通平台camera构架sensor驱动详解

优先阅读。

a5566255的专栏 3251

三种常规异步WinSock I/O模型

 1.基于事件套接字集合的select模型select(选择)模型是Winsock中最常见的I/O模型。之所以称其为“select模型”,是由于它的“中心思想”便是利用select函数,实现对I/O的管理!最初设计该模型时,主要面向的是某些使用Unix操作系统的计算机,它们采用的是Berkeley套接字方案。select模型已

不完美星空 1050

JSBSim开发手册:飞机仿真模型开发指南

JSBSim是一款开源的飞行动力学模型仿真引擎,支持多种飞行器的仿真,包括固定翼飞机、直升机、无人机等。JSBSim的设计目标是提供一个灵活、高效、精确的飞行动力学仿真环境。飞行动力学仿真:实现飞行器的动力学仿真,包括空气动力学、发动机、质量和惯性等模型。控制系统仿真:实现飞行器的控制系统仿真,包括自动驾驶仪、飞控系统等。环境仿真:模拟飞行环境,包括大气模型、风力模型等。本文详细介绍了如何使用C++进行JSBSim开发,包括系统设计、模型实现、代码优化和性能调优等方面的内容。

qq_38334677的博客 4526

Winsock 套接字非阻塞模式小例程 WinSock IO模型

服务器端使用非阻塞套接字,允许有多个客户接入。客户端使用阻塞套接字。服务器端循环轮询方式。 /***设套接字为非阻塞模式***/ unsigned long ul = 1; int nRet=ioctlsocket(sock_server, FIONBIO, &ul); //设置套接字非阻塞模式 if (nRet == SOCKET_ERROR) { cout <&lt...

m0_37357063的博客 3101

【鸿蒙游戏上架审核规范指南】

华为鸿蒙游戏上架审核规范指南摘要

weixin_44161102的博客 918

莫比乌斯反演

本文从算法竞赛和数论角度出发,系统介绍了狄利克雷卷积与莫比乌斯反演的核心概念。首先定义了数论函数及其基本性质,重点阐述了狄利克雷卷积的代数结构(交换环)和关键恒等式(如μ*1=ε)。随后通过卷积视角简化了莫比乌斯反演的证明过程。最后将理论提升至抽象代数层面,揭示这些数论工具本质上是偏序集关联代数在整除关系下的特例,其中莫比乌斯函数对应Zeta函数的逆元。全文展现了数学概念从具体到抽象的升华过程,为理解这些工具提供了更深刻的代数视角。

aichitang2024的博客 391

C++ TCP Socket的使用(阻塞)

我们经常使用微信、QQ等聊天工具,那我们能不能也写一个可以聊天的程序呢? 当然可以!

Jzd2643800386的博客 3842

基于simulink 的不间断电源ups的项目实例

UPS系统的核心组件包括整流器、逆变器、电池管理系统和控制系统。- **Three-Phase Controlled Rectifier**:设置触发角为0度,用于控制整流器的输出电压。- **Three-Phase Inverter**:设置逆变器的输出频率为60Hz,用于将直流电转换为交流电。- **Control System**:编写MATLAB函数,用于监测市电状态并控制各模块的工作模式。- **Step**:设置阶跃时间,例如0.05秒,阶跃前后的值分别为0和1,用于模拟市电中断。

xiaoheshang_123的博客 709

Winsock

WinSockWinsock初始化、反初始化错误检查和处理使用IP协议创建基本的Winsock调用来建立通信IPv4寻址字节排序创建套接字面向连接的通信在Winsock中,建立通信的步骤:服务器:客户机:套接字状态 Winsock 编译采用了WINSOCK.H的应用程序时,需要链接到WS2_32.LIB库 使用WINSOCK.H时,需要链接到WSOCK32.LIB 使用MSWSOCK.H时,需要...

qq_36308972的博客 4263

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4181

recv函数详解

别只顾着send数据啊,你也得接收一些数据啊,来而不往非礼也!如何接收?请看recv函数原型: WINSOCK_API_LINKAGE int WSAAPI recv( SOCKET s, char FAR * buf, int len, int flags );      第一个参数表示数据从哪个套接字来,第二个参数是要保存接收数据的地

认知 行动 坚持 1万+

华为OD机试双机位C卷-恢复数字序列 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 恢复数字序列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 恢复数字序列。

qq_45776114的博客 1203

基于事件套接字集合的select 模型

基于事件套接字集合的select 模型 select (选择)模型是Winsock 中最常见的I/O 模型。之所以称其为“select 模型”,是由于它的“中心思想”便是利用select 函数,实现对I/O 的管理!最初设计该模型时,主要面向的是某些使用Unix 操作系统的计算机,它们采用的是Berkeley 套接字方案。select 模型已集成到Winsock 1.1 中,它使那些想避免在套接

jiht594的专栏 1519

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Windows 套接字I/O 模型(2) 选择(select)模型

select模型是一个广泛在Winsock中石油的I/O模型。称它为select 模型,是因为它主要是使用select 函数来管理I/O 的。这个模式的设计源于UNIX 系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字。 select 函数可以确定一个或者多个套接字的状态。如果套接字上没有网络事件发生,便进入等待状态,以便执行同步I/O。函数定义如下。 int

sunnet的专栏 545

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

select模型

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

踏雪无痕 1198

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

php select事件模型,C++_C++中I/O模型之select模型实例,本文实例讲述了C++中I/O模型的s - phpStudy...

C++中I/O模型之select模型实例本文实例讲述了C++中I/O模型的select模型用法。分享给大家供大家参考。具体实现方法如下:void main(){CInitSock initSock;USHORT nPort = 9999; //监听的端口SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sListen ...

weixin_39679370的博客 120

网络编程select

select模型实现了单线程上处理多个套接字的可能 1.select 函数定义如下 int select(      int nfds;        fd_set* readfds;   //指向一个套接字集合      fd_set* writefds;      fd_set* exceptfds;  //指向一个套接字集合,用来检查错误     const str

白菜有罪的专栏 1061

Winsock网络编程套接字I/O模型之选择模型

Winsock 提供了一些 I/O 模型帮助应用程序以异步方式在一个或者多个套接字上管理 I/O。

weixin_43446169的博客 1316

TCP-IO模型之SELECT机制

网络IO模型之select 将需要查看的套接字加入到集合中,将集合交给select管理,select在内核中查看一段时间,将发生网络事件的套接字留在集合中,校验集合。 实现步骤: 1.定义集合 fd_set 2.清空集合 FD_ZERO() 3.将socket加入到集合中FD_SET 4.将集合交给select管理 select() 5.校验集合 FD_ISSET() #include <QCoreApplication> #include <winsock2.h> #inclu

weixin_45178126的博客 2058

Socket I/O模型之select模型

// MySocket.cpp : 定义控制台应用程序的入口点。// #include "stdafx.h"#pragma comment(lib, "ws2_32.lib") //Socket  Select模型简单示例SOCKET sClient;DWORD WINAPI WorkerThread(LPVOID lpParameter);int _tma

SpiritMFC的专栏 703

选择模型2

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34146410的博客 138

网络编程术语select()

网络编程术语select()

czy8787475的博客 220

I/O模型之Select模型

简单的步骤介绍了I/O模型的流程,通俗易懂

星焱宖 1134

《ASCE1885的网络编程》の套接字select模型

《ASCE1885的网络编程》の套接字select模型 2010年10月15日   套接字Select模型使得Windows Sockets应用程序可以在同一时间内管理和控制多个套接字。该模型的核心是select()函数,在使用该函数时,还需要用到FD_SET、FD_ZERO、FD_ISSET和FD_CLR四个宏。   套接字的select模型,能够使得Windows Sockets...

yge757gi 175

windows套接字I/O模型之——select模型

参考《windows网络编程》第五章。为巩固知识,以问题作为驱动,检查知识点。 windows下 Select模型 1.      Select模型有什么作用? 可以判断指定套接字上是否有数据存在、是否可以写入数据。防止因为使用send或recv过程引起的阻塞状态。 2.      Select模型有什么优点? 可以减少原有阻塞模型需要使用的多个线程,减少资源消耗。 3.      S

行者无疆的专栏 1596
上一篇: 用PUT方式上传大文件
下一篇: 帐户克隆及其防范对策
HEJSCLK
博客等级 码龄19年 17粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值