⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iocompletionport.cpp

📁 关于一个iocompletionport的例子
💻 CPP
字号:
#include<winsock2.h>
#include<stdio.h>
#include<winbase.h>

//HANDLE hIocp;
HANDLE hIocp;
SOCKET sock;

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);//工作者线程

void main()
{
	
	//加载winsock库***********************************
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	
	wVersionRequested = MAKEWORD( 1, 1);
	
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		return;
	}
	
	if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
		WSACleanup( );
		return; 
	}//
	
	hIocp = CreateIoCompletionPort(
		INVALID_HANDLE_VALUE,
		NULL,
		(ULONG_PTR)0,
		0);
	if (hIocp == NULL) {
		printf("CreateIoCompletionPort failed!");
	}
	
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == INVALID_SOCKET) {
		
		//将套接字与完成端口关联,再调用一次CreateIoCompletionPort(),指定第一个和第二个参数
		if (CreateIoCompletionPort((HANDLE)sock,
			hIocp,
			(ULONG_PTR)0,
			0) == NULL)
		{
			printf("CreateIoCompletionPort failed!");
		}		
	}
	/*在创建了完成端口、将一个或多个套接字与之相关联之后,我们就要创建若干个线程来处理完成通知。
	*这些线程不断循环调用GetQueuedCompletionStatus ()函数并返回完成通知
	*/
}


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  
			// &#8226;&#8226;&#8226;
			
			// 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 (WSAGetLastError() != WSA_IO_PENDING)
				{
					// Error
				}
			}
			break;
			
		case OP_WRITE:
			// Process the data sent, etc.
			break;
		} // switch
	} // while
}// WorkerThread



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -