살짝의 주석 첨가..


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(22), &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, 1000);
    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

+ Recent posts