使用IOCP进行客户socket与完成端口关联操作

原创 2006年06月02日 17:39:00
typedef struct _OVERLAPPEDPLUS {
OVERLAPPED ol;
SOCKET s, sclient;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
// other useful information
} OVERLAPPEDPLUS;
#define OP_READ 0
#define OP_WRITE 1
#define OP_ACCEPT 2
DWORD WINAPI WorkerThread(LPVOID lpParam)

ULONG_PTR *PerHandleKey;
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus,*newolp;
DWORD dwBytesXfered;
while (1)
{
ret = GetQueuedCompletionStatus(
hIocp,
&dwBytesXfered,
(PULONG_PTR)&PerHandleKey,
&Overlap,
INFINITE);
if (ret == 0)
{
// Operation failed
continue;
}
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
switch (OverlapPlus->OpCode)
{
case OP_ACCEPT:
// Client socket is contained in OverlapPlus.sclient
// Add client to completion port
CreateIoCompletionPort(
(HANDLE)OverlapPlus->sclient,
hIocp,
(ULONG_PTR)0,
0);
// Need a new OVERLAPPEDPLUS structure
// for the newly accepted socket. Perhaps
// keep a look aside list of free structures.
newolp = AllocateOverlappedPlus();
if (!newolp)
{
// Error
}
newolp->s = OverlapPlus->sclient;
newolp->OpCode = OP_READ;
// This function prepares the data to be sent
PrepareSendBuffer(&newolp->wbuf);
ret = WSASend(
newolp->s,
&newolp->wbuf,
1,
&newolp->dwBytes,
0,
&newolp.ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
// Put structure in look aside list for later use
FreeOverlappedPlus(OverlapPlus);
// Signal accept thread to issue another AcceptEx
SetEvent(hAcceptThread);
break;
case OP_READ:
// Process the data read 
// ???
// Repost the read if necessary, reusing the same
// receive buffer as before
memset(&OverlapPlus->ol, 0, sizeof(OVERLAPPED));
ret = WSARecv(
OverlapPlus->s,
&OverlapPlus->wbuf,
1,
&OverlapPlus->dwBytes,
&OverlapPlus->dwFlags,
&OverlapPlus->ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
break;
case OP_WRITE:
// Process the data sent, etc.
break;
} // switch
} // while
} // WorkerThread

c++编程IOCP中的socket错误和资源释放处理方法

前言: 错误处理和socket释放, 是IOCP编程中的一大难点. 本文试图就IOCP设计中经常遇到的这个难题展开论述并寻找其解决方案, 事实上, 文中所述的解决方式不仅仅适用于IOCP, 它同样...
  • youxiazzz12
  • youxiazzz12
  • 2014年04月30日 09:58
  • 1374

Win socket编程--IOCP完成端口模型

一、为什么选用完成端口 网络通信方式大致有以下几种: 同步方式:所有操作在一个线程内顺序执行,则通信操作会阻塞同一线程其他操作。同步+多线程方式:服务器端为每一个连入的客户端建立一个线程进...
  • yangyangye
  • yangyangye
  • 2014年08月18日 11:22
  • 1593

 Windows socket之IO完成端口(IOCP)模型开发

Windows socket之IO完成端口(IOCP)模型开发       IO完成端口是一种内核对象。利用完成端口,套接字应用程序能够管理数百上千个套接字。应用程序创建完成端口对象后,通过指定一定数...
  • ithzhang
  • ithzhang
  • 2013年01月21日 16:31
  • 26012

IOCP如何既能发送RST复位连接避免TIME_WAIT状态,又能重用socket?

待续
  • EasyIOCP
  • EasyIOCP
  • 2012年01月12日 13:49
  • 1504

一个简单的IOCP(IO完成端口)服务器/客户端类

作者:Amin Gholiha   翻译:高庆余 文章来源:[url]http://www.codeproject.com/KB/IP/iocp_server_client.aspx[/url] ...
  • Maybe______
  • Maybe______
  • 2016年09月12日 17:58
  • 619

IOCP完成端口的一个简单封装类

///////////////////////////////////////////////////////////////////////////////////// // Iocp 头文件...
  • sky04
  • sky04
  • 2010年06月12日 17:36
  • 5193

socket编程之完成端口(附一个简单的IOCP例子)

“完成端口”模型是迄今为止最为复杂的—种I/O模型。然而。假若—个应用程序同时需要管理为数众多的套接字,那么采用这种模型。往往可以达到最佳的系统性能,然而不幸的是,该模型只适用于以下操作系统(微软的)...
  • yangfm315
  • yangfm315
  • 2011年06月17日 17:49
  • 2634

BIO--NIO-AIO(IOCP在Java7中的实现)

背景    在 Java 的早期,JVM 在解释字节码时往往很少或没有运行时优化。这就意味着,Java 程序往往拖得很长,其运行速率大大低于本地编译代码,因而对操作系统I/O 子系统的要求并不太高。 ...
  • wenzhibinbin_pt
  • wenzhibinbin_pt
  • 2013年07月03日 21:20
  • 2525

编写大容量和健壮的服务器系列—处理IOCP连接关闭

     及时监测连接被动关闭        除非有特别要求,否则你应该总是对每个连接保持一个挂起的接收 pending io (使用 WSARecv 投递)。如果用户主动关闭连接,你的 GetQue...
  • zhanghefu
  • zhanghefu
  • 2009年12月02日 12:44
  • 2197

C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍

例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最...
  • SQLDebug_Fan
  • SQLDebug_Fan
  • 2014年01月22日 15:49
  • 43945
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用IOCP进行客户socket与完成端口关联操作
举报原因:
原因补充:

(最多只允许输入30个字)