살짝의 주석 첨가..
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #include <stdio.h> #include <Windows.h> #pragma warning(disable:4996) #pragma comment(lib, "ws2_32.lib") #define PORT 10000 #define DELAY 20 DWORD WINAPI ThreadProc(LPVOID lpParam); // Thread Proc VOID Error_Handling(LPSTR msg); // Error Handling char Msg[256]; // Received Message HANDLE h[101]; // Thread Handle Array CRITICAL_SECTION cs; int main() { // 윈속 초기화 WSADATA WsaData; WSAStartup(MAKEWORD(2, 2), &WsaData); InitializeCriticalSection(&cs); // 쓰레드 생성 DWORD i; for (i = 0; i <= 100; i++) { h[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)i, 0, NULL); Sleep(1); } printf("Wait for Connect ...."); // 쓰레드 대기 DWORD Return = WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, h, FALSE, INFINITE); return 0; } DWORD WINAPI ThreadProc(LPVOID lpParam) { // 쓰레드 동기화 EnterCriticalSection(&cs); CHAR buf[100]; DWORD i = (int)lpParam; // 동기화 해제 LeaveCriticalSection(&cs); // 소켓 생성 SOCKET Sock, Clnt; Sock = socket(AF_INET, SOCK_STREAM, 0); if (Sock == INVALID_SOCKET) { sprintf(buf, "%d Thread : socket Error", i); MessageBox(NULL, buf, "ERROR", MB_OK); return 0; } // 주소 할당 SOCKADDR_IN Serv_Addr, Clnt_Addr; Serv_Addr.sin_addr.s_addr = htonl(INADDR_ANY); Serv_Addr.sin_family = AF_INET; Serv_Addr.sin_port = htons(PORT + i); if (bind(Sock, (SOCKADDR*)&Serv_Addr, sizeof(SOCKADDR)) == SOCKET_ERROR) { sprintf(buf, "%d Thread : bind Error", i); MessageBox(NULL, buf, "ERROR", MB_OK); return 0; } // 포트 대기 if (listen(Sock, 5) == SOCKET_ERROR) { sprintf(buf, "%d Thread : listen Error", i); MessageBox(NULL, buf, "ERROR", MB_OK); return 0; } printf("%d 번 포트 대기\n", PORT + i); // 연결 요청 대기 DWORD len = sizeof(SOCKADDR); Clnt = accept(Sock, (SOCKADDR*)&Clnt_Addr, (int*)&len); if (Clnt == INVALID_SOCKET) { sprintf(buf, "%d Thread : accept Error", i); MessageBox(NULL, buf, "ERROR", MB_OK); return 0; } system("cls"); // 연결 시 printf("\r%d 번 포트 연결 !!\n", PORT + i); printf("원활한 수신을 위해 5초 대기...\n"); for (int i = 5; i > 0; i--) { printf("\r%d....", i); Sleep(1000); } printf("\r \n"); // 데이터 수신 len = recv(Clnt, (char*)buf, 100, 0); buf[len] = NULL; closesocket(Sock); strcpy(Msg, (const char*)buf); printf("Received String\n"); printf("%s\n", Msg); system("pause"); system("cls"); // 남은 쓰레드 종료 for (int j = 0; j <= 100; j++) { if (j == i) continue; DWORD ExitCode; GetExitCodeThread(h[j], &ExitCode); TerminateJobObject(h[j], ExitCode); printf("%d 번 쓰레드 종료\n", j); Sleep(DELAY); } exit(1); } VOID Error_Handling(LPSTR msg) { MessageBox(NULL, msg, "Error", MB_OK); exit(1); } | cs |
'Programing > Example_Code' 카테고리의 다른 글
Overthewire Vortex lv0 (0) | 2016.01.04 |
---|---|
320 악성코드 (0) | 2015.11.20 |
Packet Send Source by python ( Webhacking.kr 32번 문제 ) (0) | 2015.11.14 |
k4n3 Keygen (0) | 2015.10.31 |
Reversing.kr - Easy KeygenMe (0) | 2015.10.31 |