`

socket模型使归纳

阅读更多
    共有五种类型的套接字I/O模型,可让Winsock应用程序对I/O进行管理,它们包括:select(选择)、WSAAsyncSelect(异步选择)、WSAEventSelect(事件选择)、overlapped(重叠)以及completion port(完成端口)

1.select
  最初设计该模型,主要是面向某些使用Unix操作系统的计算机.使用大概原理设置一个集合,通过一个宏的定义来查询集合类的套接字可否使用。做个端口扫描用这个还是比较开心的。

2.WSAAsyncSelect
  模仿WINDOWS消息机制来实现,使用起来很方便。个人比较喜欢。MFC中的CSOCKET也采用了这个模型。
  相关函数:
int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent);
lEvent表示一个掩码组合,比如FD_CONNECT|FD_READ

LREWULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
wParam: 发生了一个网络事件的套接字
lParam: (低位)指定了已经发生的网络事件WSAGETSELECTEVENT  (高位)包含了可能出现的任何错误代码 用WSAGETSELECTERROR获取

大概使用框架如下:
创建套接字,使用WSAAsyncSelect进行套接字和事件绑定,在回调函数中写清消息响应

#define WM_SOCKET WM_USER+1
int WINAPI WinMain(HINSTANCE hINstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    SOCKET Listen;
    HWND Window;
    //Create a window and assign the winproc
    //Start Winsock and create a socket
    WSAStartup(...);
    Listen = Socket();
    bind(...);
    WSAAsyscSelect(Listen, Window, WM_SOCKET, FD_ACCEPT | FD_CLOSE);
    listen(Listen, 5);
}

BOOL CALLBACK WinProc(HWND hDlg, WORD wMsg, WORD wParam, DWORD lParam)
{
    SOCKET Accept;
    switch(wMsg)
    {
case WM_SOCKET:
        //whether an error occurred on the socket by using the WSAGETSELECTERROR() macro
        if(WSAGETSELECTERROR(lParam))
        {
    closesocket...
}
        //what event occurred on the socket
        switch( WSAGETSELECTEVENT(lParam) )
        {
    case FD_ACCEPT:
            case FD_READ:
            case FD_WRITE:
}
    }
}

FD_WRITE说明:三种条件下才会发出
使用connect WSAConnect,一个套接字首次建立连接
使用accept WSAAccept,套接字被接受以后
若send WSASend sendto WSASendTo操作失败,返回WSAEWOULDBLOCK错误,而且缓冲区空间变得可用
也就是说,收到首条FD_WRITE消息,便应认为自己必然能在一个套接字上发数据.

3 WSAEventSelect
你可以想象着,一排的空套接字等着对方的连接...
如上章所述,async投递一个窗口例程,而Event投递一个事件对象句柄.
或者更清楚解释为,套接字和事件对象对应着,当一个套接字有事件发生,事件对象返回相应的值,通过这个值来索引这个套接字。
要注意该模式里两种工作状态和模式,signaled/nonsignaled    manual reset/auto reset
一开始默认为未传信(nonsignaled)和人工重设(manual reset)状态,随着网络事件的触发,工作状态从未船信到已传信.在完成一个I/O请求处理后,要负责将工作状态改变

首先创建一个事件对象  WSAEVENT WSACreateEvent(void);
其次将事件对象和套接字联系在一起 int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents);
等待网络事件触发事件对象句柄状态 DWORD WSAWaitForMultipleEvents(....DWORD dwTimeout, BOOL fAlertable);
  dwTimeout参数规定等待一个网络事件发生有多长时间,毫秒为单位.超过立即返回,即使由fWaitAll参数规定条件未满足也如此.如果设为0,函数会检测指定的事件对象状态,然后返回.这样造成一个"轮询",尽量避免设为0.若设为WSA_INFINITE,那么只有在一个网络事件传回一个事件对象后,才会返回.
  fAlertable:忽略,设为FALSE,主要用于重叠式I/O模型中

将已传信状态更改为未传信 BOOL WSAResetEvent(WSAEVENT hEvent);
释放事件句柄使用的系统资源  BOOL WSACloseEvent(WSAEVENT hEvent);

现在还需解决的一问题是,怎么获得发生事件的套接字,async直接用一个socket变量接收,而在event里,是通过事先的一个数组索引获得.这个方法名为WSAEnumNetworkEvents();

代码框架如下:
//先创建事件数组和套接字数组
SOCKET Socket[常量];
WSAEVENT Event[];
DWORD EvenTotal = 0;
//这里进行套接字准备到bind那步,创建一个事件,并且联系
NewEvent = WSACreateEvent();
WSAEventSelect(Listen, NewEvent, FD_ACCEPT|FD_CLOSE);

//最重要一步,加入到数组
Socket[EventTotal] = Listen;
Event[EventTotal] = NewEvent;
EventTotal++;

while(TRUE)
{
    //等待一个套接字连接
    Index = WSAWaitForMultipleEvents(..);
    //在EnumNetworkEvents中进行查询,判断在哪个套接字上,发生什么网络事件类型.
    WSAEnumNetworkEvents(
         SocketArray[Index - WSA_WAIT_EVENT_0],
         EventArray[Index - WSA_WAIT_EVENT_0],
         NetworkEvents);
   
}



对一个发生事件套接字操作
WSAWaitForMultipleEvents返回值:减去预定值WSA_WAIT_EVENT_0
Iindex = WSAWaitForMultipleEvents(..);
MyEvent = EventArray[Index - WSA_WAIT_EVENT_0];
接下来可调用WSAEnumNetworkEvents函数,调查发生什么类型网络事件


4IO重叠
对一个套接字多次利用,利用CRITICAL_SECTION来进行互斥

5。。。略
分享到:
评论

相关推荐

    UNIX SOCKET编程简介

    在 Socket API 环境,其应用可以归纳为: * TCP 链接建立:根据 TCP/IP 协议,函数 connect() 激发 TCP 的三路握手过程。 * TCP 链接终止:TCP 用三个分节建立一个链接,而终止连接时需要四个分节。 Socket API ...

    windows socket简易教程

    根据提供的文档内容,我们可以归纳总结出以下几个主要的知识点: ### Windows Socket 规范概述 - **定义**:Windows Socket(WinSock)是一种基于Windows平台的网络编程接口,它支持多种网络协议,允许开发者轻松...

    多线程服务器的几种常用模型

    进程间通信的主要方法包括管道(pipe)、信号(signal)、共享内存(shared memory)、消息队列(message queue)和套接字(socket)等。其中: - **管道**:主要用于父进程和子进程间的通信,或者是具有亲缘关系的进程之间的...

    linux进程通信[归纳].pdf

    《Linux进程通信[归纳].pdf》一书是针对Linux系统环境下C语言编程的详细指南,旨在帮助开发者深入理解和掌握Linux进程通信技术。该书结合作者的实战经验,以丰富的实例和详细的注释,阐述了Linux C程序设计的核心...

    C#网络编程全[归纳].pdf

    - **网络七层模型**:OSI七层模型(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)提供了一种抽象框架,描述了数据在网络中传输的流程。 在C#中进行网络编程,开发者需要理解和掌握TCP/IP协议、套...

    java面试题归纳

    Java面试题归纳主要涵盖了许多核心的Java编程概念和技术,这些是面试官在招聘Java开发者时经常询问的主题。以下是一些重要的知识点,它们可能出现在面试题中: 1. **基础语法**:包括变量、数据类型、运算符、流程...

    android移植[归纳].pdf

    接着,调用RIL_startEventLoop启动消息队列机制,确保后续的通信基于消息模型进行。RIL_Init函数被调用来初始化Vendor RIL,这个过程中返回的RIL_RadioFunction结构体包含了onRequest()方法,该方法是rild与Vendor ...

    计算机网络实验知道手册

    根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 一、计算机网络实验基础 #### 1. 实验目的 本实验旨在帮助学生深入了解并掌握计算机网络中的关键概念和技术,特别是IP协议、网络层协议以及数据链...

    WINDOWS编程多人聊天程序

    4. **监听连接**: 使用`listen()`函数使Socket处于监听状态。 5. **接受连接**: 使用`accept()`函数等待并接受客户端的连接请求。 6. **处理请求**: 接受客户端发送的数据,并进行相应处理。 7. **发送响应**: 使用`...

    Java的21个技术点和知识点归纳(推荐)修改版.pdf

    【Java的21个技术点和知识点归纳】 Java是一门广泛使用的编程语言,尤其在互联网领域,其强大的可移植性和面向对象的特性使其备受青睐。本文将深入探讨Java的21个关键知识点,旨在帮助初学者和有经验的开发者更好地...

    linux下的网络聊天室,代码克运行[归纳].pdf

    5. **C/S架构**:客户端/服务器(Client/Server)架构是网络应用的常见模型,客户端发起请求,服务器响应请求。在网络聊天室中,客户端是用户交互的界面,而服务器处理用户的登录、聊天等操作。 6. **多线程**:多...

    使用Java编程解析Web页面归纳.pdf

    2. **HTTP协议与网络编程**:Java中的`java.net`包提供了Socket和HttpURLConnection类来处理HTTP请求和响应。理解HTTP协议的基础,如GET、POST方法,HTTP头和状态码,对于有效地解析Web页面至关重要。 3. **HTML...

    java实现多线程的网络并发服务器[归纳].pdf

    在Java中,可以使用`Socket`类来创建TCP连接,`DatagramSocket`类处理UDP通信。 2. **服务器模块**:服务器端口监听新连接,接收到请求后,创建新的线程处理请求。使用`ServerSocket`类可以监听TCP连接,而`...

    python_10_09_作业

    根据提供的文件信息,我们可以归纳总结出以下几个核心知识点: ### 一、网络基础知识 #### 1.1 什么是网络? - **计算机发展**:从单机发展到多机互联的需求,为了实现信息共享与资源访问的目的。 - **网络的形成*...

    Apache Mina Server 2.0 中文参考手册(带目录)

    4. Socket编程:掌握基于TCP/IP和UDP/IP协议的Socket通信模型。 Mina的架构设计使得它能够将网络通信的底层细节从应用程序中抽象出来,这样开发者只需要关注于编写处理数据和业务逻辑的代码。它将网络通信分解为几...

    01Web了解和Servlet初次见面.pdf

    根据提供的文件信息,我们可以归纳和展开以下几个关键知识点: ### 一、Web与Servlet的基本概念 #### 1. Web概述 - **定义**:Web是指万维网(World Wide Web),是互联网的一部分,通过HTTP协议实现信息的共享和...

    06年下半年软件设计师考试下午试题

    - **软件生命周期模型**:包括瀑布模型、增量模型、螺旋模型等,每种模型的特点及其适用场景。 - **需求分析**:如何进行有效的需求收集与分析,包括用户访谈、问卷调查等多种方法。 - **软件设计**:主要包括概要...

    奥托尼克斯CNE连接器样本.pdf

    根据文件内容,奥托尼克斯CNE系列传感器连接器的主要知识点可以详细归纳如下: 奥托尼克斯CNE系列传感器连接器是一类可靠的连接解决方案,专门设计用于各类传感器和电缆的连接。这类连接器主要有三种类型:线焊插头...

    Symbian中文技术周刊2

    根据给定的信息,我们可以归纳并深入探讨以下几个关键的知识点: ### Symbian操作系统概述 Symbian 是一款专为智能手机设计的操作系统,由Symbian有限公司开发,该公司由诺基亚、摩托罗拉、爱立信等多家公司共同...

Global site tag (gtag.js) - Google Analytics