Delphi-IOCP学习笔记<一>====从零开始学习IOCP

简介: 之前一直接从事企业管理的软件,接触网络比较少。网络方面的知识也很惨。 最近想弄下iocp。网上找了很多资料,大部分是关于c++的。delphi的比较少。 看了下,不适合刚接触网络的菜鸟学习! 看过fxh的blog,觉得写的容易理解。

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

最近想弄下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是工作的函数,用线程的方式方式运行。

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

目录
相关文章
|
存储 安全 Linux
从零开始学习DPDK:掌握这些常用库函数就够了(上)
从零开始学习DPDK:掌握这些常用库函数就够了
|
网络协议 Unix Linux
从零开始学习 Linux 内核套接字:掌握网络编程的必备技能
从零开始学习 Linux 内核套接字:掌握网络编程的必备技能
|
存储 缓存 算法
从零开始学习DPDK:掌握这些常用库函数就够了(下)
从零开始学习DPDK:掌握这些常用库函数就够了
|
编译器 程序员 C语言
游戏编程之二 windows编程基础
游戏编程之二 windows编程基础
77 0
|
Linux
【Linux网络编程】服务端编程初体验
【Linux网络编程】服务端编程初体验
103 0
|
Windows
[转载]Windows网络编程系列教程之四:Select模型
原文:http://www.51see.com/asp/bbs/public/bp_show.asp?t_id=200308131152297103讲一下套接字模式和套接字I/O模型的区别。先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事。
887 0
|
容器 数据可视化 开发工具
|
网络协议 Windows
Delphi下IOCP开源框架:DIOCP 成功应用案例分享
首先说明,该项目不是本人的项目,本文转自盒子。 该项目使用的DIOCP版本为1.0,目前diocp为3.5   以下是盒子的原文 ------------------------------------------------------------------------------ DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定、高效并且使用起来十分简单。
1351 0
|
JavaScript 前端开发 Windows
Delphi TWebBrowser编程简述(转帖)
Delphi 3开始有了TWebBrowser构件,不过那时是以ActiveX控件的形式出现的,而且需要自己引入,在其后的4.0和5.0中,它就在封装好shdocvw.dll之后作为Internet构件组之一出现在构件面板上了。
1441 0