-
Windows的异步选择机制
2010-07-25 15:44:00而windows sockets的异步选择函数提供了消息机制的网络事件选择:当使用它登记的网络事件发生时,windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。...发现书上已经写得很清楚了,就懒得再写了,直接从书里摘出来。以下内容摘自《windows sockets网络程序设计大全》。
1、Unix下sockets异步事件的获得是通过调用select函数来进行查询,通常形式都是在循环内部使用select函数来进行选择。而windows sockets的异步选择函数提供了消息机制的网络事件选择:当使用它登记的网络事件发生时,windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。
2、用来注册异步消息的函数是WSAAsyncSelect函数,其函数原型如下:
int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);
它请求Windows Sockets DLL在检测到套接字s上发生的网络事件lEvent时,向窗口hWnd发送一个消息wMsg。它自动地设置套接字处于非阻塞工作方式,参数lEvent由下列事件的一个或多个组合而成:
值 含义
FD_READ 期望在套接字s收到数据(即读准备好)时接到通知。
FD_WRITE 期望在套接字s可发送数据(即写准备好)时接到通知。
FD_OOB 期望在套接字s上有带外数据到达时接到通知
FD_ACCEPT 期望在套接字s上有外来连接时接到通知
FD_CONNECT 期望在套接字s连接建立完成时接到通知
FD_CLOSE 期望在套接字s关闭时接到通知
3、需要注意的是,为一个套接字发布的WSAAsyncSelect()函数调用将取消在它之前发布的WSAAsyncSelect()函数调用的作用。在上面的例子里,使用下面的代码不会做所期望的工作:第二次调用将取消第一次调用的作用,只有FD_WRITE事件发生时会用消息wMsg2来报告。
rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);
rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);
根据这一特性,我们为了注销对套接字s上发生的网络事件的消息发送,就可以将参数lEvent设为0来调用它:
rc = WSAAsyncSelect(s, hWnd,0,0);
4、Windows Sockets DLL在一个网络事件发生后,它只给相应的应用程序发送一个消息。但是当应用程序使用函数调用隐式地允许重新发送此网络事件的消息时,应用程序的窗口函数又可能再次收到相应的消息。这些事件有:FD_READ、FD_OOB、FD_ACCEPT。
对于FD_CONNECT和FD_CLOSE事件来说,因为它们只是一种状态(连接建立成功和连接关闭),因此不会产生多个消息。
如果应用程序在收到FD_WRITE消息之后使用send()或sendto()调用发送数据均成功返回,那么它在以后需要再次发送数据时可以直接发送;但如果它希望再次获得一个FD_WRITE消息,则必须使用函数WSAAsyncSelect()来重新注册FD_WRITE事件。
5、如果使用WSAAsyncSelect()函数为监听套接字设置了事件选择,那么此事件选择将同样作用于新的接收套接字。并且它们拥有相同的消息wMsg值,如果应用程序对于不同的接收套接字要求不同的消息或事件,那么它应该使用WSAAsyncSelect()函数来给接收套接字设置不同的事件选择。
6、基本使用方法
A.第一步是在某个套接字上注册特定的事件,通过设置lEvent为不同的值来实现。如WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE)。
B.在窗口函数的消息循环中增加一个分支:
case wMsg:
switch (lParam) {
case FD_READ:
/* 从套接字wParam读取数据 */
case FD_WRITE:
/* 向套接字wParam发送数据 */
}
break;
7、当套接字s上注册的网络事件(读准备好或写准备好)发生时,窗口hWnd将收到消息wMsg。消息变量wParam指示发生网络事件的套接字,变量lParam的低字描述发生的网络事件,高字包含错误码。
-
Windows Sockets API 网络异步通讯
2010-09-16 11:16:00在微软联合其它几家公司共同制定了一套Windows下的网络编程接口Windows Sockets规范后,由于在其规范中引入了一些异步函数,增加了对网络事件异步选择机制,因此更加符合Windows的消息驱动特性,使网络开发人员一、 引言
在80年代初,美国加利福尼亚大学伯克利分校的研究人员为TCP/IP网络通信开发了一个专门用于网络通讯开发的API。这个API就是Socket接口(套接字)--当今在TCP/IP网络最为通用的一种API,也是在互联网上进行应用开发最为通用的一种API。在微软联合其它几家公司共同制定了一套Windows下的网络编程接口Windows Sockets规范后,由于在其规范中引入了一些异步函数,增加了对网络事件异步选择机制,因此更加符合Windows的消息驱动特性,使网络开发人员可以更加方便的进行高性能网络通讯程序的设计。本文接下来就针对Windows Sockets API进行面向连接的流式套接字编程以及对异步网络通讯的编程实现等问题展开讨论。
二、 面向连接的流式套接字编程模型的设计
本文在方案选择上采用了在网络编程中最常用的一种模型--客户机/服务器模型。这种客户/服务器模型是一种非对称式编程模式。该模式的基本思想是把集中在一起的应用划分成为功能不同的两个部分,分别在不同的计算机上运行,通过它们之间的分工合作来实现一个完整的功能。对于这种模式而言其中一部分需要作为服务器,用来响应并为客户提供固定的服务;另一部分则作为客户机程序用来向服务器提出请求或要求某种服务。
本文选取了基于TCP/IP的客户机/服务器模型和面向连接的流式套接字。其通信原理为:服务器端和客户端都必须建立通信套接字,而且服务器端应先进入监听状态,然后客户端套接字发出连接请求,服务器端收到请求后,建立另一个套接字进行通信,原来负责监听的套接字仍进行监听,如果有其它客户发来连接请求,则再建立一个套接字。默认状态下最多可同时接收5个客户的连接请求,并与之建立通信关系。因此本程序的设计流程应当由服务器首先启动,然后在某一时刻启动客户机并使其与服务器建立连接。服务器与客户机开始都必须调用Windows Sockets API函数socket()建立一个套接字sockets,然后服务器方调用bind()将套接字与一个本地网络地址捆扎在一起,再调用listen()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长度。在此之后服务器就可以通过调用accept()来接收客户机的连接。
相对于服务器,客户端的工作就显得比较简单了,当客户端打开套接字之后,便可通过调用connect()和服务器建立连接。连接建立之后,客户和服务器之间就可以通过连接发送和接收资料。最后资料传送结束,双方调用closesocket()关闭套接字来结束这次通讯。整个通讯过程的具体流程框图可大致用下面的流程图来表示:
面向连接的流式套接字编程流程示意图
三、 软件设计要点以及异步通讯的实现根据前面设计的程序流程,可将程序划分为两部分:服务器端和客户端。而且整个实现过程可以大致用以下几个非常关键的Windows Sockets API函数将其惯穿下来:
服务器方:
socket()->bind()->listen->accept()->recv()/send()->closesocket()
客户机方:
socket()->connect()->send()/recv()->closesocket()
有鉴于以上几个函数在整个网络编程中的重要性,有必要结合程序实例对其做较深入的剖析。服务器端应用程序在使用套接字之前,首先必须拥有一个Socket,系统调用socket()函数向应用程序提供创建套接字的手段。该套接字实际上是在计算机中提供了一个通信埠,可以通过这个埠与任何一个具有套接字接口的计算机通信。应用程序在网络上传输、接收的信息都通过这个套接字接口来实现的。在应用开发中如同使用文件句柄一样,可以对套接字句柄进行读写操作:
sock=socket(AF_INET,SOCK_STREAM,0);
函数的第一个参数用于指定地址族,在Windows下仅支持AF_INET(TCP/IP地址);第二个参数用于描述套接字的类型,对于流式套接字提供有SOCK_STREAM;最后一个参数指定套接字使用的协议,一般为0。该函数的返回值保存了新套接字的句柄,在程序退出前可以用 closesocket(sock);函数来将其释放。服务器方一旦获取了一个新的套接字后应通过bind()将该套接字与本机上的一个端口相关联:
sockin.sin_family=AF_INET;
sockin.sin_addr.s_addr=0;
sockin.sin_port=htons(USERPORT);
bind(sock,(LPSOCKADDR)&sockin,sizeof(sockin)));该函数的第二个参数是一个指向包含有本机IP地址和端口信息的sockaddr_in结构类型的指针,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网络上标识出来。需要注意的是由于1024以内的埠号都是保留的埠号因此如无特别需要一般不能将sockin.sin_port的埠号设置为1024以内的值。然后调用listen()函数开始侦听,再通过accept()调用等待接收连接以完成连接的建立:
//连接请求队列长度为1,即只允许有一个请求,若有多个请求,
//则出现错误,给出错误代码WSAECONNREFUSED。
listen(sock,1);
//开启线程避免主程序的阻塞
AfxBeginThread(Server,NULL);
……
UINT Server(LPVOID lpVoid)
{
……
int nLen=sizeof(SOCKADDR);
pView->newskt=accept(pView->sock,(LPSOCKADDR)& pView->sockin,(LPINT)& nLen);
……
WSAAsyncSelect(pView->newskt,pView->m_hWnd,WM_SOCKET_MSG,FD_READ|FD_CLOSE);
return 1;
}
这里之所以把accept()放到一个线程中去是因为在执行到该函数时如没有客户连接服务器的请求到来,服务器就会停在accept语句上等待连接请求的到来,这势必会引起程序的阻塞,虽然也可以通过设置套接字为非阻塞方式使在没有客户等待时可以使accept()函数调用立即返回,但这种轮询套接字的方式会使CPU处于忙等待方式,从而降低程序的运行效率大大浪费系统资源。考虑到这种情况,将套接字设置为阻塞工作方式,并为其单独开辟一个子线程,将其阻塞控制在子线程范围内而不会造成整个应用程序的阻塞。对于网络事件的响应显然要采取异步选择机制,只有采取这种方式才可以在由网络对方所引起的不可预知的网络事件发生时能马上在进程中做出及时的响应处理,而在没有网络事件到达时则可以处理其他事件,这种效率是很高的,而且完全符合Windows所标榜的消息触发原则。前面那段代码中的WSAAsyncSelect()函数便是实现网络事件异步选择的核心函数。
通过第四个参数注册应用程序感兴取的网络事件,在这里通过FD_READ|FD_CLOSE指定了网络读和网络断开两种事件,当这种事件发生时变会发出由第三个参数指定的自定义消息WM_SOCKET_MSG,接收该消息的窗口通过第二个参数指定其句柄。在消息处理函数中可以通过对消息参数低字节进行判断而区别出发生的是何种网络事件:
void CNetServerView::OnSocket(WPARAM wParam,LPARAM lParam)
{
int iReadLen=0;
int message=lParam & 0x0000FFFF;
switch(message)
{
case FD_READ://读事件发生。此时有字符到达,需要进行接收处理
char cDataBuffer[MTU*10];
//通过套接字接收信息
iReadLen = recv(newskt,cDataBuffer,MTU*10,0);
//将信息保存到文件
if(!file.Open("ServerFile.txt",CFile::modeReadWrite))
file.Open("E:ServerFile.txt",CFile::modeCreate|CFile::modeReadWrite);
file.SeekToEnd();
file.Write(cDataBuffer,iReadLen);
file.Close();
break;
case FD_CLOSE://网络断开事件发生。此时客户机关闭或退出。
……//进行相应的处理
break;
default:
break;
}
}在这里需要实现对自定义消息WM_SOCKET_MSG的响应,需要在头文件和实现文件中分别添加其消息映射关系:
头文件:
//{{AFX_MSG(CNetServerView)
//}}AFX_MSG
void OnSocket(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()实现文件:
BEGIN_MESSAGE_MAP(CNetServerView, CView)
//{{AFX_MSG_MAP(CNetServerView)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SOCKET_MSG,OnSocket)
END_MESSAGE_MAP()
在进行异步选择使用WSAAsyncSelect()函数时,有以下几点需要引起特别的注意:
1. 连续使用两次WSAAsyncSelect()函数时,只有第二次设置的事件有效,如:
WSAAsyncSelect(s,hwnd,wMsg1,FD_READ);
WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE);这样只有当FD_CLOSE事件发生时才会发送wMsg2消息。
2.可以在设置过异步选择后通过再次调用WSAAsyncSelect(s,hwnd,0,0);的形式取消在套接字上所设置的异步事件。
3.Windows Sockets DLL在一个网络事件发生后,通常只会给相应的应用程序发送一个消息,而不能发送多个消息。但通过使用一些函数隐式地允许重发此事件的消息,这样就可能再次接收到相应的消息。
4.在调用过closesocket()函数关闭套接字之后不会再发生FD_CLOSE事件。
以上基本完成了服务器方的程序设计,下面对于客户端的实现则要简单多了,在用socket()创建完套接字之后只需通过调用connect()完成同服务器的连接即可,剩下的工作同服务器完全一样:用send()/recv()发送/接收收据,用closesocket()关闭套接字:
sockin.sin_family=AF_INET; //地址族
sockin.sin_addr.S_un.S_addr=IPaddr; //指定服务器的IP地址
sockin.sin_port=m_Port; //指定连接的端口号
int nConnect=connect(sock,(LPSOCKADDR)&sockin,sizeof(sockin));
本文采取的是可靠的面向连接的流式套接字。在数据发送上有write()、writev()和send()等三个函数可供选择,其中前两种分别用于缓冲发送和集中发送,而send()则为可控缓冲发送,并且还可以指定传输控制标志为MSG_OOB进行带外数据的发送或是为MSG_DONTROUTE寻径控制选项。在信宿地址的网络号部分指定数据发送需要经过的网络接口,使其可以不经过本地寻径机制直接发送出去。这也是其同write()函数的真正区别所在。由于接收数据系统调用和发送数据系统调用是一一对应的,因此对于数据的接收,在此不再赘述,相应的三个接收函数分别为:read()、readv()和recv()。由于后者功能上的全面,本文在实现上选择了send()-recv()函数对,在具体编程中应当视具体情况的不同灵活选择适当的发送-接收函数对。
小结:TCP/IP协议是目前各网络操作系统主要的通讯协议,也是 Internet的通讯协议,本文通过Windows Sockets API实现了对基于TCP/IP协议的面向连接的流式套接字网络通讯程序的设计,并通过异步通讯和多线程等手段提高了程序的运行效率,避免了阻塞的发生
-
windows socket网络编程四:异步选择模型
2021-01-04 16:31:59文章目录分析服务器异步选择绑定服务器事件绑定客户端事件事件分类处理处理错误处理其他消息问题运行结果模型流程图源码链接 分析 参考windows消息机制的模型。 消息机制:所有的用户操作均依次按顺序(有序处理)被...分析
参考windows消息机制的模型。
消息机制:所有的用户操作均依次按顺序(有序处理)被记录,装进一个队列,消息队列由操作系统维护,系统通过我们设置的回调函数处理不同类型的消息。操作系统为每个窗口创建一个消息队列并且维护,所以我们想要使用消息队列,那就要创建一个窗口,该模型只能用于windows,不过我们可以学到这种处理思想。
服务器
直到开始监听都是一模一样的。
创建窗口也不是重点。异步选择
int WSAAPI WSAAsyncSelect( SOCKET s, HWND hWnd, u_int wMsg, long lEvent );
功能:将socket与消息绑定在一起,并投递给操作系统
参数:- s — socket
- hWnd — 窗口句柄
- wMsg — 消息编号
- lEvent — 消息类型(跟WSASelectEvent一模一样)
返回值:
- 如果成功,返回0。
- 如果失败,返回SOCKET_ERROR。
绑定服务器事件
代码:
// 自定义消息 #define UM_ASYNCSELECTMSG WM_USER + 1 // 异步选择 if (SOCKET_ERROR == WSAAsyncSelect(socketServer, hWnd, UM_ASYNCSELECTMSG, FD_ACCEPT)) { printf("WSAAsyncSelect 失败 error:%d\n", WSAGetLastError()); closesocket(socketServer); WSACleanup(); return -1; }
绑定客户端事件
// 绑定客户端事件 if (SOCKET_ERROR == WSAAsyncSelect(socketClient, hWnd, UM_ASYNCSELECTMSG, FD_READ | FD_WRITE | FD_CLOSE)) { printf("WSAAsyncSelect 失败 error:%d\n", WSAGetLastError()); closesocket(socketClient); break; }
事件分类处理
参数 信息 客户端socket (SOCKET)wParam 产生的错误码 HIWORD(lParam) 具体的消息种类 LOWORD(lParam) 处理错误
因为有序,所以删除需要整体移位置。
SOCKET sock = (SOCKET)wparam; // 获取socket // 获取错误 if (0 != HIWORD(lparam)) { if (WSAECONNABORTED == HIWORD(lparam)) { TextOut(hdc, 0, x, _T("客户端正常下线"), strlen("客户端正常下线")); x += 15; WSAAsyncSelect(sock, hWnd, 0, 0); // 关闭该socket上的消息 closesocket(sock); // 记录数组中有序删除该socket for (int i = 0; i < g_count; ++i) { if (sock == g_sockALL[i]) { g_sockALL[i] = g_sockALL[g_count - 1]; --g_count; break; } } } break; }
处理其他消息
和事件选择模型类似
// 具体消息 switch (LOWORD(lparam)) { case FD_ACCEPT: { TextOut(hdc, 0, x, _T("accept"), strlen("accept")); x += 15; SOCKET socketClient = accept(sock, NULL, NULL); if (INVALID_SOCKET == socketClient) { printf("accept 失败 error:%d\n", WSAGetLastError()); break; } // 绑定客户端事件 if (SOCKET_ERROR == WSAAsyncSelect(socketClient, hWnd, UM_ASYNCSELECTMSG, FD_READ | FD_WRITE | FD_CLOSE)) { printf("WSAAsyncSelect 失败 error:%d\n", WSAGetLastError()); closesocket(socketClient); break; } // 记录 g_sockALL[g_count] = socketClient; ++g_count; } break; case FD_READ: { TextOut(hdc, 0, x, _T("read"), strlen("read")); char str[1024] = { 0 }; if (SOCKET_ERROR == recv(sock, str, 1023, 0)) { printf("recv 失败 error:%d\n", WSAGetLastError()); break; } else { // 给客户回信 if (SOCKET_ERROR == send(sock, "ok", strlen("ok") + 1, 0)) { printf("send 失败 error:%d\n", WSAGetLastError()); } } TextOut(hdc, 30, x, str, strlen(str)); x += 15; } break; case FD_WRITE: TextOut(hdc, 0, x, _T("wrtie"), strlen("wrtie")); x += 15; break; case FD_CLOSE: TextOut(hdc, 0, x, _T("客户端正常下线"), strlen("客户端正常下线")); x += 15; WSAAsyncSelect(sock, hWnd, 0, 0); // 关闭该socket上的消息 closesocket(sock); // 记录数组中有序删除该socket for (int i = 0; i < g_count; ++i) { if (sock == g_sockALL[i]) { g_sockALL[i] = g_sockALL[g_count - 1]; g_count--; break; } } }
问题
在一次处理过程中,客户端产生多次send,服务器会产生多次接收消息,第一次接收消息会收完所有信息。
运行结果
模型流程图
和事件选择模型一样把select模型的同步阻塞变成了异步阻塞。源码链接
百度云链接:https://pan.baidu.com/s/1xBOiSADlAG2gO1TC6BBO_A
提取码:sxbd -
Windows Socket网络编程--异步套接字
2010-04-03 00:54:00在阻塞模式下,在I/0 操作完成之前,执行操作的Windows函数会一直等待下去,不会立即返回(将控制权交换给主程序),如果这时候网络上没有数据,那么函数将会一直等待下去,该函数将会阻塞函数的执行,从而导致调用...1.Windows套接字在两种模式下执行I/0操作:阻塞模式和非阻塞模式。在阻塞模式下,在I/0 操作完成之前,执行操作的Windows函数会一直等待下去,不会立即返回(将控制权交换给主程序),如果这时候网络上没有数据,那么函数将会一直等待下去,该函数将会阻塞函数的执行,从而导致调用线程的暂停运行。在非阻塞模式下,函数无论如何都会立即返回,系统会采用某种机制将函数的操作结果通知给线程,后者根据这个通知信息可以判断该操作是否成功。
2.Windows Socket为了支持Windows消息驱动机制,它对网络事件采用基于消息的异步存取策略。
3.Windos Socket的异步选择函数WSAAsyncSelect提供了对网络事件的选择,当使用这个函数所登记过的网络事件发生时,Windows应用程序的窗口函数将收到一个消息,消息指示了网络事件的发生。例如:如果登记的一个网络读取事件FD_READ,一旦有数据到来,就会触发这个FD_READ这个事件的发生,操作系统就会通知一个消息来通知调用线程,后者就会在相应的消息处理函数当中去接受这个数据。
-
libevent 网络异步通信库
2013-03-02 10:29:03他主要作用是避免网络通信的时候一直阻塞,可以异步的并发,以达到节省资源和提升效率的作用,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等linux系统调用管理事件机制。著名分布式缓存... -
异步I/O机制
2012-07-10 14:56:35Linux和Windows都为异步I/O构建了大量的基础设施。本文总结了一下Linux和Windows下的异步I/O模型,并给出了一些使用这些模型的例子。 一般来说,服务器端的I/O主要有两种情况:一是来自网络的I/O;二是对... -
Windows IO模型-WSAAsynSelect模型(异步阻塞模型)
2017-09-08 13:40:41异步选择(WSAAsyncSelect)模型:属于被动通知,基于消息机制,需要向Windows注册消息,当对应的网络事件发生时,向指定窗口发送指定消息。 缺点:(1)消息不安全,而且会慢,消息的过程比较复杂。(2)基于窗口,必须... -
windows网络模型
2017-03-01 16:41:00Windows提供了四种异步IO技术,机制几乎时相同的,区别在于通知结果的方式不同: 1、通过注册的消息函数进行通知 2、通过内核event事件进行通知 3、通过称为完成例程的回调函数进行通知 4、通过完成端口进行通知... -
Windows Sockets 网络编程
2011-10-18 11:01:51一、简介 WINDOWS SOCKETS 是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行...这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。 WINDOW -
Windows Sockets 网络编程 WINDOWS SOCKETS 1.1 程序设计
2009-08-18 09:29:00这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。WINDOWS SOCKETS由两部分组成:开发组件和运行组件。开发组件:WINDOWS SOCKETS 实现文档、应用程序接口(API)引 -
《Windows网络编程技术》高清PDF版+随书源码
2016-04-04 15:00:03本书专门讨论Windows网络编程技术,覆盖Windows 95/98/NT 4/2000/CE平台。内容包括NetBIOS和Windows重定向器方法、Winsock方法、客户端远程访问服务器方法。本书论述深入浅出、用大量实例详解了微软网络API函数的... -
《Windows网络与通信程序设计(第3版)》——1.3 网络程序寻址方式
2017-05-02 09:21:00本节书摘来自异步社区《Windows网络与通信程序设计(第3版)》一书中的第1章,第1.3节,作者: 陈香凝 , 王烨阳 , 陈婷婷 , 张铮 更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.3 网络程序寻址方式 编写... -
Windows Sockets 网络编程(三) —— WINDOWS SOCKETS 1.1 程序设
2013-01-22 13:20:16这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。 WINDOWS SOCKETS由两部分组成:开发组件和运行组件。 开发组件:WINDOWS SOCKETS 实现文档、应用程序接口 -
Windows Sockets 网络编程(三) —— WINDOWS SOCKETS 1.1 程序设计
2009-05-30 18:49:00这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。WINDOWS SOCKETS由两部分组成:开发组件和运行组件。开发组件:WINDOWS SOCKETS 实现文档、应用程序接口(API) -
windows socket网络编程五:重叠IO模型
2021-01-05 00:41:46文章目录分析事件通知重叠IO结构体创建支持重叠IO的socket投递异步...我们socket的操作本质上都是字符串的拷贝复制,重叠IO是windows提供的一种异步读写文件的机制,将读的指令以及我们的buffer投给操作系统,然后 -
Windows Sockets 网络编程(三) —— WINDOWS SOCKETS 1.1 程序设计(转)
2011-03-07 16:32:00一、简介WINDOWS SOCKETS 是从 ...这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。WINDOWS SOCKETS由两部分组成:开发组件和运行组件。开发组件:WINDOWS SOCKETS... -
【Windows网络编程】完成端口IOCP原理及案例
2017-10-19 13:09:43它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows... -
转:Windows Sockets 网络编程(三) —— WINDOWS SOCKETS 1.1 程序设计
2008-11-01 01:55:00作者:冰点工作室 小鹰 http://www.vckbase.net/document/viewdoc/?id=536 一、简介 WINDOWS SOCKETS 是从 ...这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。 -
基于消息的异步Socket学习
2012-08-30 15:43:41基于消息的异步Socket 1、基于消息的异步套接字,异步处理数据能有效避免...Windows Socekts 的异步选择函数WSAAsynSelect提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函 -
使用异步选择函数WSAAsyncSelect
2007-08-22 18:56:00Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略。Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择... -
《Windows网络与通信程序设计》读书笔记----WSAEventSelect模型
2013-05-05 10:41:38WSAEventSelect模型 Winsock提供另一种有用的异步事件通知I/O...它与WSAAsyncSelect模型类似是因为它也接收FD_XXX类型的网络事件,不过并不是依靠Windows的消息驱动机制,而是经由事件对象句柄通知。 使用这个模型的 -
libusb的异步也有这样的问题
2016-09-19 14:44:551. 最近一直在关注异步机制,不管是网络库asio,libuv,还是libusb库,其实异步机制都是差不多的,都是基于回调函数、系统轮询实现的。 2. 下面是一款对一款USB产品做得测试结果,Windows环境下,用libusb异步API写... -
异步SOCKET与同步SOCKET
2019-06-23 10:21:32阻塞与非阻塞SOCKET Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作...Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生... -
异步socket
2010-06-21 15:01:00(windows 98上不是,因为98没有这样的机制)。如果微软没有撒谎的话。 发送大量数据时,Socket.BeginSend和Socket.Send的速度是有差别的。在局域网里面,这种差别表现不明显。 但是在一个高延迟的网络中,... -
Visual C++网络编程经典案例详解 第3章 多线程与异步套接字编程 进程间通信 油槽
2018-09-18 07:58:16油槽是Windows系统提供单向通信的机制 进程中一方只能写入或读取数据 另一方只能读取和写入数据 通过油槽用户可以实现一对多或跨网络的进程自己的通信 当油槽传输的数据非常小 一般400kb 用户操作数据过大 可能导致... -
《Windows网络与通信程序设计》读书笔记----IOCP与可伸缩网络程序
2013-05-06 15:34:52I/O完成端口是应用程序使用线程池处理I/O请求的一种机制。处理多个并发异步I/O请求时,使用I/O完成端口比在I/O请求时创建线程更快更有效。 CreateIoCompletionPort函数有点复杂,需要说明一下 ... -
异步程序相关
2014-12-22 10:30:00libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制 libev是libevent之后的一个事件驱动的编程框架,其接口和libevent基本类似。据... -
Windows Sockets网络编程 可能是最清晰版本(Windows Sockets 2规范解释小组负责人亲自执笔。)总共4个包,...
2015-11-03 20:57:38提供了翔实的背景知识和框架方面的概念,借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、...
-
java jtextfield 居中_java – 如何使JTextfield居中
-
MySQL 触发器
-
java eventsource_利用EventSource对象实现服务器推送(java servlet)
-
PPT大神之路高清教程
-
java socket多人聊天_如何运用Java socket实现多人聊天室功能
-
UL923-2019 Microwave Cooking Appliances - 完整英文版(189页)
-
unqlite java_开源NoSQL数据库UnQLite介绍
-
java静态程序_JAVA程序实例-java静态函数
-
基于SSM实现的房屋租赁系统【附源码】(毕设)
-
笔记本主板ME和序列号BIOS提取识别工具
-
libFuzzer视频教程
-
unlocker3.03.rar
-
【硬核】一线Python程序员实战经验分享(1)
-
java ibatis 乱码_ibatis 保存中文乱码有关问题解决方案
-
C#实现在线升级,在线更新源码
-
MySQL 高可用工具 DRBD 实战部署详解
-
Liunx 优化思路与实操步骤
-
【Python-随到随学】 FLask第一周
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
java socket传文件_Java利用socket传输文件