source: cheroxy/trunk/src/main.cpp@ 52

Last change on this file since 52 was 52, checked in by cheese, 11 years ago

#1 cerr 가끔 crash 나서 수정

File size: 3.9 KB
Line 
1#ifdef _WIN32
2# define _CRT_SECURE_NO_WARNINGS
3#endif
4
5#include "CRXSocket.h"
6#include "CRXProxy.h"
7
8#include <iostream>
9#include <iomanip>
10#include <sstream>
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15
16using namespace std;
17
18#ifdef _WIN32
19# include <process.h>
20# define THREAD_TYPE void *
21# define THREAD_FUNCTION_RETURN unsigned int
22# define THREAD_FUNCTION_CALLING_CONVENTION WINAPI
23#else
24# include <pthread.h>
25# define THREAD_TYPE pthread_t
26# define THREAD_FUNCTION_RETURN void *
27# define THREAD_FUNCTION_CALLING_CONVENTION
28#endif
29
30THREAD_FUNCTION_RETURN
31THREAD_FUNCTION_CALLING_CONVENTION
32CRXProxyMTWrapper (void * aThreadArg);
33
34int ThreadPool (CRXSocket * aProxySocket,
35 const int aThreadPoolCount);
36
37int main (int argc, char* argv[])
38{
39 int aResult = 0;
40 const short aPort = 8080;
41 const int aThreadPoolCount = 50;
42
43 CRXSocket aProxySocket;
44
45 /*----------------------------------------------------------------*/
46 /* 1. create proxy server */
47 aResult = aProxySocket.CreateServer (aPort);
48 if (aResult < 0)
49 {
50 cout << "Failed to create server." << endl;
51 return aResult;
52 }
53
54 /* 2. ready proxy servers */
55 aResult = ThreadPool (&aProxySocket, aThreadPoolCount);
56 if (aResult)
57 {
58 cout << "Failed to create thread pool." << endl;
59 return aResult;
60 }
61
62 /* 3. keep process */
63 while (true);
64
65 /*----------------------------------------------------------------*/
66 aProxySocket.Close ();
67
68 return aResult;
69}
70
71int ThreadPool (CRXSocket * aProxySocket,
72 const int aThreadPoolCount)
73{
74 int aResult = 0;
75 int aIter = 0;
76 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
77
78 /*----------------------------------------------------------------*/
79 for (aIter = 0 ; aIter < aThreadPoolCount ; aIter++)
80 {
81#ifdef _WIN32
82 aThreadID = (void *)_beginthreadex (0, 0, CRXProxyMTWrapper, aProxySocket, 0, 0);
83 if (aThreadID == NULL)
84 {
85 aResult = -1;
86 break;
87 }
88 CloseHandle (aThreadID);
89#else
90 aResult = pthread_create (&aThreadID, NULL, CRXProxyMTWrapper, aProxySocket);
91 if (aResult < 0)
92 {
93 break;
94 }
95#endif
96 cout << "Thread(" << aIter + 1 << ") is created successfully." << endl;
97 }
98 /*----------------------------------------------------------------*/
99
100 return aResult;
101}
102
103THREAD_FUNCTION_RETURN
104THREAD_FUNCTION_CALLING_CONVENTION
105CRXProxyMTWrapper (void * aThreadArg)
106{
107 int aResult = 0;
108
109 CRXSocket & aProxySocket = *((CRXSocket *)aThreadArg);
110 CRXProxy * aProxy = NULL;
111
112 char aFilterFileExtension[] = "exe|gif|jpg|png|css|js|ico|swf|";
113
114 /*----------------------------------------------------------------*/
115 for (;;)
116 {
117 aResult = aProxySocket.Accept ();
118 if (aResult < 0)
119 {
120 cout << aProxySocket.GetErrorMessage () << endl;
121 aResult = -1;
122 break;
123 }
124
125 aProxy = new(std::nothrow) CRXProxy (aResult);
126 if (aProxy == NULL)
127 {
128 cout << "Failed to get proxy." << endl;
129 aResult = -1;
130 break;
131 }
132 aProxy->SetServerTimeout (2);
133
134 CRXFilter & aFilter = aProxy->GetFilter ();
135 CRXHttpRequest & aRequest = aProxy->GetHttpRequest ();
136 CRXHttpResponse & aResponse = aProxy->GetHttpResponse ();
137
138 aFilter.SetRequestFilter (CRX_FILTER_REQUEST_FILE_EXTENSION,
139 CRX_FILTER_MATCHED,
140 aFilterFileExtension);
141
142 aResult = aProxy->Forward ();
143 if (aResult < 0)
144 {
145 cout << aProxy->GetErrorMessage () << endl;
146 }
147
148 if (!aFilter.CheckRequestFilter (CRX_FILTER_REQUEST_FILE_EXTENSION, aRequest))
149 {
150 CRX_DEBUG_TRACE ("== Request: \n%s\n", aRequest.GetHeader ().c_str ());
151 CRX_DEBUG_TRACE ("== Response: \n%s\n", aResponse.GetHeader ().c_str ());
152 CRX_DEBUG_TRACE_BIN (aResponse.GetContentBody (),
153 aResponse.GetContentLength (),
154 "== Content-Body: \n");
155 }
156
157 delete aProxy;
158 }
159
160 cout << " thread exit." << endl;
161 /*----------------------------------------------------------------*/
162
163 return (THREAD_FUNCTION_RETURN)0;
164}
Note: See TracBrowser for help on using the repository browser.