************************请教关于完成端口的问题**************************
我在写完成端口代码时这样做的
class CClientContext
{
private:
OVERLAPPED *m_pol;
WSABUF *m_pwbuf;
int m_nTotalBytes;
int m_nSendBytes;
SOCKET m_Socket;
int m_nOpCode;
char m_szBuffer[MAX_BUFFER_LEN];
public:
void SetOpCode(int n)
{
this->m_nOpCode = n;
}
int GetOpCode()
{
return this->m_nOpCode;
}
void SetTotalBytes(int n)
{
this->m_nTotalBytes = n;
}
int GetTotalBytes()
{
return this->m_nTotalBytes;
}
void SetSentBytes(int n)
{
this->m_nSendBytes = n;
}
void IncrSentBytes(int n)
{
this->m_nSendBytes += n;
}
int GetSendBytes()
{
return this->m_nSendBytes;
}
void SetSocket(SOCKET s)
{
this->m_Socket = s;
}
SOCKET GetSocket()
{
return this->m_Socket;
}
void SetBuffer(char *szBuffer)
{
strcpy(this->m_szBuffer,szBuffer);
}
void GetBuffer(char *szBuffer)
{
strcpy(szBuffer,this->m_szBuffer);
}
void ZeroBuffer()
{
ZeroMemory(this->m_szBuffer,MAX_BUFFER_LEN);
}
void SetWSABufferLength(int nLen)
{
this->m_pwbuf->len = nLen;
}
int GetWSABUFLength()
{
return this->m_pwbuf->len;
}
WSABUF* GetWSABUFPtr()
{
return this->m_pwbuf;
}
OVERLAPPED* GetOVERLAPPEDPtr()
{
return this->m_pol;
}
void ResetWSABUF()
{
this->ZeroBuffer();
this->m_pwbuf->buf = this->m_szBuffer;
this->m_pwbuf->len = MAX_BUFFER_LEN;
}
CClientContext()
{
this->m_pol = new OVERLAPPED;
this->m_pwbuf = new WSABUF;
ZeroMemory(this->m_pol,sizeof(OVERLAPPED));
this->m_Socket = SOCKET_ERROR;
ZeroMemory(this->m_szBuffer,MAX_BUFFER_LEN);
this->m_pwbuf->buf = this->m_szBuffer;
this->m_pwbuf->len = MAX_BUFFER_LEN;
this->m_nOpCode = 0;
this->m_nTotalBytes = 0;
this->m_nSendBytes = 0;
}
~CClientContext()
{
while(!HasOverlappedIoCompleted(this->m_pol))
{
Sleep(0);
}
closesocket(this->m_Socket);
delete this->m_pol;
delete this->m_pwbuf;
}
};
HANDLE g_hShutDownEvent = NULL;
int g_nThreads = 0;
HANDLE *g_phWorkerThreads = NULL;
HANDLE g_hAcceptThread = NULL;
HANDLE g_hBeginWorkerEvent = NULL;
WSAEVENT g_hAcceptEvent;
SOCKET listenSocket;
CRITICAL_SECTION g_csConsole;
CRITICAL_SECTION g_csClientList;
HANDLE g_hIOCompletionPort = NULL;
std::vector<CClientContext *> g_ClientContext;
g_nThreads = WORKER_THREADS_PER_PROCESSOR * GetNoOfProcessors();
g_phWorkerThreads = new HANDLE[g_nThreads];
InitializeCriticalSection(&g_csConsole);
InitializeCriticalSection(&g_csClientList);
g_hShutDownEvent = CreateEvent(NULL , TRUE , FALSE , NULL);
g_hBeginWorkerEvent = CreateEvent(NULL , TRUE , FALSE , NULL);
WSADATA wsaData;
int nResult;
nResult = WSAStartup(0x0202,&wsaData);
if(nResult!=0)
{
AfxMessageBox(IDS_ERROR_INIATESOCKET);
return false;
}
if(wsaData.wVersion!=0x0202)
{
AfxMessageBox(IDS_ERROR_INIATESOCKET);
return false;
}
listenSocket;
SOCKADDR_IN sockAddr;
listenSocket = WSASocket(AF_INET ,SOCK_STREAM , 0 , NULL , 0 , WSA_FLAG_OVERLAPPED);
if(listenSocket==INVALID_SOCKET)
{
AfxMessageBox(IDS_ERROR_INIATESOCKET);
goto error;
}
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(SERVERPORT);
if(bind(listenSocket , (SOCKADDR *)&sockAddr , sizeof(sockAddr)) == SOCKET_ERROR)
{
AfxMessageBox(IDS_ERROR_BINDPORT);
goto error;
}
if(listen(listenSocket,SOMAXCONN)==SOCKET_ERROR)
{
AfxMessageBox(IDS_ERROR_WHENLISTEN);
goto error;
}
g_hAcceptEvent = WSACreateEvent();
if(WSA_INVALID_EVENT==g_hAcceptEvent)
{
AfxMessageBox(IDS_ERROR_CREATEEVENT);
goto error;
}
if(SOCKET_ERROR==WSAEventSelect(listenSocket , g_hAcceptEvent , FD_ACCEPT))
{
AfxMessageBox(IDS_ERROR_BINDEVENT);
goto error;
}
DWORD nThreadID;
g_hAcceptThread = CreateThread(0 ,0 ,AcceptThread , (LPVOID)listenSocket , 0 , &nThreadID);
if(!InitializeIOCP())
{
AfxMessageBox(IDS_ERROR_CREATEIOCOMPLETION);
goto error;
}
error:
closesocket(listenSocket);
WSACleanup();
return false;