Red de conocimientos turísticos - Información de alquiler - ¿Algún experto tiene una clase de encapsulación para IOCP para BCB?

¿Algún experto tiene una clase de encapsulación para IOCP para BCB?

El siguiente código es para su referencia: #pragma?once

#include

#pragma?comment(?lib,?"ws2_32.lib"? )

const?int?OP_READ?=?0;

const?int?OP_WRITE?=?1;

const?int?OP_ACCEPT?=? 2 ;

/* OVERLAPPEDPLUS? Idea de diseño de estructura OVERLAPPED es una variable de estructura fija que se utiliza para procesar el valor de retorno de eventos de mensajes de red y se utiliza para devolver eventos de mensajes en el puerto de finalización. Como resultado, al procesar mensajes de red, se envía un puntero de estructura con un valor de retorno. Siempre que la parte frontal de la estructura cumpla con los requisitos del sistema, el puntero de estructura se enviará de regreso al usuario cuando el sistema. La operación es exitosa. Siempre que extendamos algunas de nuestras propias cosas detrás de la estructura definida por el sistema, podemos determinar fácilmente quién envió el mensaje.

Sin embargo, parece que el puerto de finalización también satisfizo tales necesidades al diseñar, por lo que aquí solo pongo algunos datos relacionados con la conexión del sistema. Los datos que el usuario necesita almacenar no se almacenan aquí. : socket OpCode? El tipo de operación de este mensaje (en la operación del puerto de finalización, el sistema recibe una notificación mediante un mensaje. Para leer/escribir datos, se debe enviar dicha estructura de mensaje, por lo que si el sistema desea realizar la lectura y escribir operaciones al mismo tiempo. Necesita una variable para distinguir las operaciones) WSABUFwbuf;?//Leer y escribir variables de estructura de búfer DWORDdwBytes,?dwFlags;?//Algunas variables icónicas utilizadas en la lectura y escritura char?buf[4096]; ?/ / Las cuatro variables en su propio búfer almacenan algunos datos relacionados con mensajes, que se utilizan en algunas operaciones. Para funciones específicas, debe consultar la interfaz de parámetros de las funciones relacionadas con el puerto completas. p>

*/

struct?OVERLAPPEDPLUS

{ OVERLAPPEDol; int?OpCode;

};

class?CIOCP

{

protected: HANDLE?g_hwThread;?//Hilo de trabajo handle DWORD?m_wthreadID; ;?//Identificador del hilo de conexión DWORD?m_athreadID;

public: bool?m_workThread; bool?m_acceptThread; HANDLE?m_hIocp;?//Identificador del puerto de finalización SOCKET?m_sSocket;

public : CIOCP(vacío); ~CIOCP(vacío); virtual?vacío?OnRead(vacío?*?p,?char?*buf,?int?len){}; ?void?OnClose(void?*?p){}; bool?SetIoCompletionPort(SOCKET?socket,?void?*p,?char?*buf?=?NULL,?int?len?=?0); Asocie un socket y una estructura personalizada al puerto de finalización (equivalente a vincular el socket a una variable de estructura), // De esta manera, cuando se envíen los tres eventos de red anteriores, la variable de estructura se pasará nuevamente Regrese al programa / / De esta manera puede distinguir de qué socket proviene el evento de red actual bool?Init(void); bool?Listen(int?port); static?DWORD?__stdcall?WorkThread(LPVOID?Param?DWORD? (LPVOID?Param);

};

clase?CIOCPClient:?público?CIOCP

{

protegido: SOCKET?m_socket ;

público: bool?Connect(char?*ip,?int?port void?Send(char?*buf,?int?len);

}; /p>

//////////////////////////////

/////////////////////////////////////////////////// //// /////////////////Iocp?Archivo de implementación?#include?"StdAfx.h"#include?"iocp.h"?static?bool?bInit?= ?false;?DWORD? __stdcall?CIOCP::WorkThread(LPVOID?Param){?CIOCP?*?pthis?=?(CIOCP?*)Param;?void?*?re;?OVERLAPPED?*?pOverlap;?DWORD ?berByte;? while( pthis->m_workThread)?{?int?ret;?ret?=?GetQueuedCompletionStatus(pthis->m_hIocp,?&berByte,?(LPDWORD)&re,?(LPOVERLAPPED?*)&pOverlap,?INFINITE) ;?if?(ret ?==?ERROR_SUCCESS)?{?}?if?(berByte?==?0)?{?//Cliente desconectado?pthis->OnClose(re);?OVERLAPPEDPLUS?*olp?= ?(OVERLAPPEDPLUS ?*)pOverlap;?closesocket(olp->s);?delete?olp;//¿Liberar?la variable de estructura vinculada al socket?continue;?}?if?(re?==?NULL)? return? 0;?OVERLAPPEDPLUS?*olp?=?(OVERLAPPEDPLUS?*)pOverlap;?switch(olp->OpCode)?{?case?OP_READ:?pthis->OnRead(re,?olp->wbuf.buf, ?berByte );?//Llamar?OnRead()?para notificar a la aplicación que el servidor ha recibido datos de red del cliente?WSARecv(olp->s,?&olp->wbuf,?1,?&olp->dwBytes, ?&olp-> dwFlags,?&olp->ol,?NULL);?//Continuar llamando a una solicitud?I/O?asincrónica recibida?break;?default:?break;?}?}?return?0;} ?DWORD?__stdcall ?CIOCP::AcceptThread(LPVOID?Param){?CIOCP?*?pthis?=?(CIOCP?*)Param;? while(pthis->m_acceptThread)?{?SOCKET?client;?if?( (cliente=? aceptar(pthis->m_sSocket,?NULL,?NULL))?==?INVALID_SOCKET)?{?//Manejo de errores?}?pthis->OnAccept(cliente);//Llamar a ?OnAccept() para ¿Notificar a la aplicación una nueva conexión de Cliente?}?return?1;}?CIOCP::CIOCP(void){}?CIOCP::~CIOCP(void){}?bool?CIOCP::Init(void){?if? (bInit)?retorno?true;?WSADATA?wsd;?if?(WSAStartup(MAKEWORD(2,2),?&wsd)?!=?0)?return?false;?bInit?=?true;?return? verdadero;}? bool?CIOCP::Escuchar

(int?puerto){?if?(!bInit)?if?(!Init())?return?false;?m_sSocket?=?socket(AF_INET,?SOCK_STREAM,?0);?if?(m_sSocket?= =?INVALID_SOCKET)?return?false;?//SOCKADDR_IN?addr;?sockaddr_in?addr;?addr.sin_family?=?AF_INET;?addr.sin_port?=?htons(puerto);?addr.sin_addr.S_un.S_addr ?=?htonl(INADDR_ANY);?//addr.sin_addr.S_un.S_addr?=?inet_addr(ip);?if?(bind(m_sSocket,?(struct?sockaddr?*)&addr,?sizeof(addr)) ?==?SOCKET_ERROR)?return?false;?if?(listen(m_sSocket,?10)?==?SOCKET_ERROR)?return?false;?if?((m_hIocp?=?CreateIoCompletionPort(INVALID_HANDLE_VALUE,?NULL,? NULL,?0))?==?NULL)?//Crear el identificador del puerto de finalización?return?false;?this->m_acceptThread?=?true;?g_haThread?=?CreateThread(NULL,?0,? AcceptThread, ?(LPVOID)this,?0,?&m_athreadID);// ¿Crear un hilo de conexión para recibir conexiones de cliente?this->m_workThread?=?true;?g_hwThread?=?CreateThread(NULL,?0,?WorkThread, ?(LPVOID)this,?0,?&m_wthreadID);?//Crear un hilo de trabajo para procesar el mensaje del puerto de finalización?return?true;}?bool?CIOCP::SetIoCompletionPort(SOCKET?socket,?void?*p , ?char?*buf,?int?len){?if?(CreateIoCompletionPort((HANDLE)socket,?m_hIocp,?(ULONG_PTR)p,?0)?==?NULL)?return?false;?OVERLAPPEDPLUS? olp?=?new?OVERLAPPEDPLUS;?memset(olp,?0,?sizeof(OVERLAPPEDPLUS));?olp->s?=?socket;?if?(buf)?{?//Aquí puedes usar user- definido La dirección del búfer definida, si el usuario no desea configurarla, también puede usar el búfer asignado predeterminado?olp->wbuf.buf?=?buf;?olp->wbuf.len?=?len;?}? ¿olp?{? olp->wbuf.buf?=?olp->buf;?olp->wbuf.len?=?4096;?}?olp->OpCode?=?OP_READ;?int?ret?=?WSARecv (olp-> s,?&olp->wbuf,?1,?&olp->dwBytes,?&olp->dwFlags,?&olp->ol,?NULL);?if?(ret?==?SOCKET_ERROR)?if ?(WSAGetLas

tError()?=?ERROR_IO_PENDING)?return?false;?return?true;}?void?CIOCP::OnAccept(SOCKET?socket){?this->SetIoCompletionPort(socket,?NULL);}?//= = ================================================== = ===============================?bool?CIOCPClient::Connect(char?*ip,?int?port) { ?//¿Conectarse al servidor?if?(!bInit)?if?(!Init())?return?false;?//Inicializar el socket de conexión?m_socket?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP) ;? if?(m_socket?==?SOCKET_ERROR)?{//printf("cocket?Create?fail");?return?false;?}?//?Complete la información de la dirección del servidor?//?El puerto es 1982?// ?La dirección IP es INADDR_ANY. Utilice htonl para convertir la dirección IP al formato de red ServerAddr.sin_family?=?AF_INET;?sockaddr_in?ClientAddr;?ClientAddr.sin_family?=?AF_INET;?ClientAddr.sin_port? =?htons(port); ClientAddr.sin_addr.s_addr?=?inet_addr(ip);?//?Bind puerto de escucha?bind(m_socket,?(SOCKADDR?*)&ClientAddr,?sizeof(ClientAddr));?if? (connect(m_socket,? (SOCKADDR?*)&ClientAddr,?sizeof(ClientAddr))?==?SOCKET_ERROR)?{?return?false;?}?if?((m_hIocp?=?CreateIoCompletionPort(INVALID_HANDLE_VALUE,?NULL, ?NULL,?0) )?==?NULL)?//Crear el identificador del puerto de finalización?return?false;?this->m_workThread?=?true;?g_hwThread?=?CreateThread(NULL,?0, ?WorkThread,?(LPVOID)this ,?0,?&m_wthreadID);?//¿Crear un hilo de trabajo para procesar el mensaje del puerto de finalización?this->SetIoCompletionPort(m_socket,?&m_socket);//¿Establecer el socket de escucha del puerto de finalización? return?true;}?void ?CIOCPClient::Send(char?*buf,?int?len){?send(m_socket,?buf,?len,?0);}?///////// /////// //////////////////////////////////////////// /////////// ////////////////////?IOCPclient?Código de aplicación?#include?stdafx.h"#include?"IOCP .h"#include?"TClientSocket.h"clase ?Iocp?:public?CIOCPClient{?void?OnRead(void?*?

p,?char?*buf,?int?len)?{?printf(buf);?Sleep(1000);?this->Send(buf,?len);Archivo: archivo fuente de encapsulación de clase simple de tamaño rar. : 3KB Descargar: Descargar archivo: Ejemplo de aplicación simple de IOCP. Tamaño rar: 318KB Descargar: Descargar?}};?int?_tmain(int?argc,?_TCHAR*?argv[]){?Iocp?iocp;? Init();?iocp.Connect("127.0.0.1",?4311);?iocp.Send("test\0",?5);?gets(new?char[1000]);?return? }