PROGRAMMING/ALGORITHM
beginthreadex_
뉴암스테르담
2015. 8. 17. 15:32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | // input your code here bool Network::InitNetworkWindows() { #ifdef __linux__ #else unsigned int i; if (WSAStartup(MAKEWORD(2, 2), &wsaData_) != 0) { CLog::WriteLog(LOG_TYPE::LOG_TYPE_EXIT, "WSAStartup () Error"); return false; } hComPort_ = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); GetSystemInfo(&sysInfo_); for (i = 0; i < sysInfo_.dwNumberOfProcessors; i++) { _beginthreadex(NULL, 0, [](void* arg) ->unsigned int{ HANDLE hComPort = (HANDLE)arg; SOCKET sock; DWORD bytesTrans; LPPER_HANDLE_DATA handleInfo; LPPER_IO_DATA ioInfo; DWORD flags; while (1){ GetQueuedCompletionStatus(hComPort, &bytesTrans, (LPDWORD)&handleInfo, (LPOVERLAPPED*)&ioInfo, INFINITE); sock = handleInfo->hClntSocket; if (ioInfo->rwMode == READ) { CLog::WriteLog(LOG_TYPE::LOG_TYPE_DEBUG, "message received"); if (bytesTrans == 0) { closesocket(sock); free(handleInfo); free(ioInfo); continue; } memset(&(ioInfo->overlapped), 0, sizeof(OVERLAPPED)); ioInfo->wsaBuf.len = bytesTrans; ioInfo->rwMode = WRITE; WSASend(sock, &(ioInfo->wsaBuf), 1, NULL, 0, &(ioInfo->overlapped), NULL); ioInfo = (LPPER_IO_DATA)malloc(sizeof(PER_IO_DATA)); memset(&(ioInfo->overlapped), 0, sizeof(OVERLAPPED)); ioInfo->wsaBuf.len = BUF_SIZE; ioInfo->wsaBuf.buf = ioInfo->buffer; ioInfo->rwMode = READ; WSARecv(sock, &(ioInfo->wsaBuf), 1, NULL, &flags, &(ioInfo->overlapped), NULL); } else { puts("message sent!"); free(ioInfo); } } return 0; } , (LPVOID)hComPort_, 0, NULL); } #endif return 0; } | cs |