zoukankan      html  css  js  c++  java
  • DelphiIOCP学习笔记<一>====从零开始学习IOCP

    之前一直接从事企业管理的软件,接触网络比较少。网络方面的知识也很惨。

    最近想弄下iocp。网上找了很多资料,大部分是关于c++的。delphi的比较少。

    看了下,不适合刚接触网络的菜鸟学习!

    看过fxh的blog,觉得写的容易理解。

    http://fxh7622.blog.51cto.com/63841/7667

    基本上按照他的blog代码进行的编写。编译理解iocp的原理。

    首先我来个通俗的理解步骤。

    1.服务器创建一个iocp端口服务。

    2.服务器创建N个工作线程,不停的轮流处理这个端口上面的连接和请求。

    3.开启iocp的端口服务<绑定监听端口,进行监听>。如果接收到请求,通知iocp工作线程。

    *刚开始看人家代码的时候,一直想为什么是先创建工作线程,而不是先开启端口服务。

    <我是这样理解的>如果先开启端口服务,如果这个时候有连接,工作线程还没有准备就绪,那就会错过请求。

    好下面开始分析代码<尽量去掉了其他代码,这样更看的清楚>

       1:  var
       2:    WSData: TWSAData;
       3:    lvIOPort:THandle;
       4:    hThread, dwThreadId:DWORD;
       5:   
       6:    sSocket, cSocket:TSocket;
       7:    lvAddr:TSockAddr;
       8:    lvAddrSize:Integer;
       9:    lvMsg:String;
      10:    lvPort:Integer;
      11:   
      12:    lvSystemInfo: TSystemInfo;
      13:    i:Integer;
      14:    lvCount:Integer;
      15:  begin
      16:   
      17:    lvPort := 8988;
      18:   
      19:    //加载SOCKET。使用的是2.2版为了后面方便加入心跳。
      20:    WSAStartup($0202, WSData);
      21:   
      22:    // 创建一个完成端口(内核对象)
      23:    lvIOPort := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
      24:   
      25:   
      26:    //获取系统信息<cpu的数量>
      27:    // GetSystemInfo(lvSystemInfo);
      28:    //lvCount := lvSystemInfo.dwNumberOfProcessors * 2 -1;
      29:   
      30:    //便于调试先创建一个工作线程
      31:    lvCount := 1;
      32:   
      33:    for I:=0 to lvCount do
      34:    begin
      35:       hThread := CreateThread(nil, 0, @ServerWorkerThread, 
      36:         Pointer(lvIOPort),0, dwThreadId);
      37:       if (hThread = 0) then
      38:       begin
      39:           Exit;
      40:       end;
      41:       CloseHandle(hThread);
      42:    end;
      43:   
      44:   
      45:    //创建一个套接字,将此套接字和一个端口绑定并监听此端口。
      46:    sSocket:=WSASocket(AF_INET,SOCK_STREAM,0,Nil,0,WSA_FLAG_OVERLAPPED);
      47:    if sSocket=SOCKET_ERROR then
      48:    begin
      49:        closesocket(sSocket);
      50:        WSACleanup();
      51:    end;
      52:    lvAddr.sin_family:=AF_INET;
      53:    lvAddr.sin_port:=htons(lvPort);
      54:    lvAddr.sin_addr.s_addr:=htonl(INADDR_ANY);
      55:    if bind(sSocket,@lvAddr,sizeof(lvAddr))=SOCKET_ERROR then
      56:    begin
      57:       closesocket(sSocket);
      58:    end;
      59:   
      60:    listen(sSocket,20);

    其中ServerWorkerThread是工作的函数,用线程的方式方式运行。

    //下一篇分析下监听工作。

  • 相关阅读:
    正反向代理工具squid
    docker安装jira
    pandas输出的数据集导入数据库
    python监控接口告警模板
    Auth认证
    Form与ModelForm的 使用
    原生Ajax与jQuery的Ajax和伪Ajax
    Django缓存与信号
    Django的生命周期与中间件的流程
    CSRF的原理和基本使用
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3024122.html
Copyright © 2011-2022 走看看