bool CClient::Start() { do { if (m_socket == INVALID_SOCKET) { m_socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); if (m_socket == INVALID_SOCKET) { LOGNET("Fail to create client[%d] socket.", GetID()); break; } } static GUID GuidAcceptEx = WSAID_ACCEPTEX; static LPFN_ACCEPTEX AcceptEx = (LPFN_ACCEPTEX)GetExtensionFunction(m_pServer->GetListenSocket(), GuidAcceptEx); NetData* pData = m_accept.GetNetData(); pData->extra = this; DWORD recvLen = 0; if (AcceptEx(m_pServer->GetListenSocket(), m_socket, pData->buffer.buf, 0, sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, &recvLen, &pData->overlapped) == FALSE) { if (WSAGetLastError() != WSA_IO_PENDING) { LOGNET("Client[%d] fail to call AcceptEx.", GetID()); break; } } return true; } while (false); Stop(); return false; }
VOID * SocketExtension::GetExtensionFunction(GUID * clasid) { if (clasid == NULL) { return NULL; } INT error = 0; SOCKET s = LayeredServiceProvider_Current.NextProcTable.lpWSPSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED, &error); if (s == INVALID_SOCKET) { return NULL; } VOID* func = GetExtensionFunction(s, clasid); LayeredServiceProvider_Current.NextProcTable.lpWSPShutdown(s, SD_BOTH, &error); LayeredServiceProvider_Current.NextProcTable.lpWSPCloseSocket(s, &error); return func; }
bool CClient::AppendDisconnect(bool restart) { static GUID GuidDisconnectEx = WSAID_DISCONNECTEX; static LPFN_DISCONNECTEX DisconnectEx = (LPFN_DISCONNECTEX)GetExtensionFunction(m_socket, GuidDisconnectEx); CLock lock(&m_criticalSection); NetData* pData = m_discon.GetNetData(); if (DisconnectEx(m_socket, &pData->overlapped, TF_REUSE_SOCKET, 0) == FALSE) { if (WSAGetLastError() != WSA_IO_PENDING) { LOGNET("Client[%d] to call DisconnectEx.", GetID()); return false; } } m_status = NETSTATUS_Disconnecting; m_lastActionTime = (int)time(NULL); return true; }
VOID * SocketExtension::GetExtensionFunction(GUID clasid) { return GetExtensionFunction(&clasid); }
VOID * SocketExtension::GetExtensionFunction(SOCKET s, GUID clasid) { return GetExtensionFunction(s, &clasid); }