void DummyClientSession::ConnectCompletion() { if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0)) { DWORD errCode = GetLastError(); if (WSAENOTCONN == errCode) printf_s("Connecting a server failed: maybe WSAENOTCONN??\n"); else printf_s("SO_UPDATE_CONNECT_CONTEXT failed: %d\n", errCode); return; } int opt = 1; if (SOCKET_ERROR == setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] TCP_NODELAY error: %d\n", GetLastError()); CRASH_ASSERT(false); return; } opt = 0; if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] SO_RCVBUF change error: %d\n", GetLastError()); CRASH_ASSERT(false); return; } if (1 == InterlockedExchange(&mConnected, 1)) { CRASH_ASSERT(false); } if (false == PreRecv()) { printf_s("[DEBUG] PreRecv for Server Connection error: %d\n", GetLastError()); InterlockedExchange(&mConnected, 0); return; } int curr = GSessionManager->IncreaseClientSession(); printf_s("[DEBUG:%d] Session established: IP=%s, PORT=%d \n", curr, inet_ntoa(mConnectAddr.sin_addr), ntohs(mConnectAddr.sin_port)); Login(); }
void ServerSession::ConnectCompletion() { if ( SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0) ) { DWORD errCode = GetLastError(); if ( WSAENOTCONN == errCode ) printf_s("Connecting a server failed: maybe WSAENOTCONN??\n"); else printf_s("SO_UPDATE_CONNECT_CONTEXT failed: %d\n", errCode); return; } int opt = 1; if (SOCKET_ERROR == setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] TCP_NODELAY error: %d\n", GetLastError()); CRASH_ASSERT(false); return; } opt = 0; if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] SO_RCVBUF change error: %d\n", GetLastError()); CRASH_ASSERT(false); return; } if (false == PreRecv()) { printf_s("[DEBUG] PreRecv error: %d\n", GetLastError()); } if (1 == InterlockedExchange(&mConnected, 1)) { CRASH_ASSERT(false); } }
void ClientSession::AcceptCompletion() { // for test // TRACE_PERF; TRACE_THIS; CRASH_ASSERT(LThreadType == THREAD_IO_WORKER); if (1 == InterlockedExchange(&mConnected, 1)) { /// already exists? CRASH_ASSERT(false); return; } bool resultOk = true; do { if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)GIocpManager->GetListenSocket(), sizeof(SOCKET))) { printf_s("[DEBUG] SO_UPDATE_ACCEPT_CONTEXT error: %d\n", GetLastError()); resultOk = false; break; } int opt = 1; if (SOCKET_ERROR == setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] TCP_NODELAY error: %d\n", GetLastError()); resultOk = false; break; } opt = 0; if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] SO_RCVBUF change error: %d\n", GetLastError()); resultOk = false; break; } int addrlen = sizeof(SOCKADDR_IN); if (SOCKET_ERROR == getpeername(mSocket, (SOCKADDR*)&mClientAddr, &addrlen)) { printf_s("[DEBUG] getpeername error: %d\n", GetLastError()); resultOk = false; break; } HANDLE handle = CreateIoCompletionPort((HANDLE)mSocket, GIocpManager->GetComletionPort(), (ULONG_PTR)this, 0); if (handle != GIocpManager->GetComletionPort()) { printf_s("[DEBUG] CreateIoCompletionPort error: %d\n", GetLastError()); resultOk = false; break; } } while (false); if (!resultOk) { DisconnectRequest(DR_ONCONNECT_ERROR); return; } printf_s("[DEBUG] Client Connected: IP=%s, PORT=%d\n", inet_ntoa(mClientAddr.sin_addr), ntohs(mClientAddr.sin_port)); if (false == PreRecv()) { printf_s("[DEBUG] PreRecv error: %d\n", GetLastError()); } //TEST: 요놈의 위치는 원래 C_LOGIN 핸들링 할 때 해야하는거지만 지금은 접속 완료 시점에서 테스트 ㄱㄱ //todo: 플레이어 id는 여러분의 플레이어 테이블 상황에 맞게 적절히 고쳐서 로딩하도록 static int id = 101; mPlayer.TestCreatePlayerData( L"testName" ); mPlayer.RequestLoad( id++ ); mPlayer.TestDeletePlayerData( id ); // DONE }
void ClientSession::AcceptCompletion() { CRASH_ASSERT(LThreadType == THREAD_IO_WORKER); if (1 == InterlockedExchange(&mConnected, 1)) { /// already exists? CRASH_ASSERT(false); return; } bool resultOk = true; do { if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)GIocpManager->GetListenSocket(), sizeof(SOCKET))) { printf_s("[DEBUG] SO_UPDATE_ACCEPT_CONTEXT error: %d\n", GetLastError()); resultOk = false; break; } int opt = 1; if (SOCKET_ERROR == setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] TCP_NODELAY error: %d\n", GetLastError()); resultOk = false; break; } opt = 0; if (SOCKET_ERROR == setsockopt(mSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&opt, sizeof(int))) { printf_s("[DEBUG] SO_RCVBUF change error: %d\n", GetLastError()); resultOk = false; break; } int addrlen = sizeof(SOCKADDR_IN); if (SOCKET_ERROR == getpeername(mSocket, (SOCKADDR*)&mClientAddr, &addrlen)) { printf_s("[DEBUG] getpeername error: %d\n", GetLastError()); resultOk = false; break; } HANDLE handle = CreateIoCompletionPort((HANDLE)mSocket, GIocpManager->GetComletionPort(), (ULONG_PTR)this, 0); if (handle != GIocpManager->GetComletionPort()) { printf_s("[DEBUG] CreateIoCompletionPort error: %d\n", GetLastError()); resultOk = false; break; } } while (false); if (!resultOk) { DisconnectRequest(DR_ONCONNECT_ERROR); return; } printf_s("[DEBUG] Client Connected: IP=%s, PORT=%d\n", inet_ntoa(mClientAddr.sin_addr), ntohs(mClientAddr.sin_port)); if (false == PreRecv()) { printf_s("[DEBUG] PreRecv error: %d\n", GetLastError()); } }