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

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

#1 change logic more detail

File size: 4.3 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# define THREAD_TYPE pthread_t
25# define THREAD_FUNCTION_RETURN void *
26# define THREAD_FUNCTION_CALLING_CONVENTION
27#endif
28
29THREAD_FUNCTION_RETURN
30THREAD_FUNCTION_CALLING_CONVENTION
31CRXProxyMTWrapper (void * aThreadArg);
32
33int ThreadPool (CRXSocket * aProxySocket,
34 const int aThreadPoolCount);
35
36int main (int argc, char* argv[])
37{
38 int aResult = 0;
39 const short aPort = 8080;
40 const int aThreadPoolCount = 30;
41
42 CRXSocket aProxySocket;
43
44 /*----------------------------------------------------------------*/
45 /* 1. create proxy server */
46 aResult = aProxySocket.CreateServer (aPort);
47 if (aResult < 0)
48 {
49 cout << "Failed to create server." << endl;
50 return aResult;
51 }
52
53 /* 2. ready proxy servers */
54 aResult = ThreadPool (&aProxySocket, aThreadPoolCount);
55 if (aResult)
56 {
57 cout << "Failed to create thread pool." << endl;
58 return aResult;
59 }
60
61 /* 3. keep process */
62 while (true);
63
64 /*----------------------------------------------------------------*/
65 aProxySocket.Close ();
66
67 return aResult;
68}
69
70THREAD_FUNCTION_RETURN
71THREAD_FUNCTION_CALLING_CONVENTION
72CRXProxyMTWrapper (void * aThreadArg)
73{
74 int aResult = 0;
75
76 CRXSocket * aProxySocket = (CRXSocket *)aThreadArg;
77 CRXProxy * aProxy = NULL;
78
79 char aFilterFileExtension[] = "exe|gif|jpg|png|css|js|ico|swf|";
80 char * aHttpMessage = NULL;
81 int aHttpMessageLength = 0;
82
83 /*----------------------------------------------------------------*/
84 for (;;)
85 {
86 aResult = aProxySocket->Accept ();
87 if (aResult < 0)
88 {
89 cerr << "Failed to accept." << endl;
90 break;
91 }
92
93 if ((aProxy = new(std::nothrow) CRXProxy ()) == NULL)
94 {
95 cerr << "Failed to get proxy." << endl;
96 aResult = -1;
97 break;
98 }
99
100 aProxy->SetClientSocket (aResult);
101 aProxy->SetServerTimeout (2);
102 aProxy->SetRequestFilter (CRX_FILTER_REQUEST_FILE_EXTENSION,
103 CRX_FILTER_MATCHED,
104 aFilterFileExtension);
105
106 aResult = aProxy->Forward ();
107 if (aResult < 0)
108 {
109 cout << aProxy->GetErrorMessage () << endl;
110 }
111
112 if (!aProxy->CheckRequestFilter (CRX_FILTER_REQUEST_FILE_EXTENSION))
113 {
114 aHttpMessageLength = aProxy->GetHttpRequestLength ();
115 aHttpMessage = (char *) calloc (aHttpMessageLength + 1, 1);
116 aProxy->GetHttpRequest (aHttpMessage, aHttpMessageLength);
117 CRX_DEBUG_TRACE ("== Request: \n%s\n", aHttpMessage);
118 free (aHttpMessage);
119
120 aHttpMessageLength = aProxy->GetHttpResponseHeaderLength ();
121 aHttpMessage = (char *) calloc (aHttpMessageLength + 1, 1);
122 aProxy->GetHttpResponseHeader (aHttpMessage, aHttpMessageLength);
123 CRX_DEBUG_TRACE ("== Response: \n%s\n", aHttpMessage);
124 free (aHttpMessage);
125
126 aHttpMessageLength = aProxy->GetHttpResponseBodyLength ();
127 aHttpMessage = (char *) calloc (aHttpMessageLength + 1, 1);
128 aProxy->GetHttpResponseBody (aHttpMessage, aHttpMessageLength);
129 CRX_DEBUG_TRACE_BIN (aHttpMessage, aHttpMessageLength, "== Content-Body: \n");
130 free (aHttpMessage);
131 }
132
133 delete aProxy;
134 }
135
136 cout << " thread exit." << endl;
137 /*----------------------------------------------------------------*/
138
139 return (THREAD_FUNCTION_RETURN)0;
140}
141
142int ThreadPool (CRXSocket * aProxySocket,
143 const int aThreadPoolCount)
144{
145 int aResult = 0;
146 int aIter = 0;
147 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
148
149 /*----------------------------------------------------------------*/
150 for (aIter = 0 ; aIter < aThreadPoolCount ; aIter++)
151 {
152#ifdef _WIN32
153 aThreadID = (void *)_beginthreadex (0, 0, CRXProxyMTWrapper, aProxySocket, 0, 0);
154 if (aThreadID == NULL)
155 {
156 aResult = -1;
157 break;
158 }
159 CloseHandle (aThreadID);
160#else
161 aResult = pthread_create (&aThreadID, NULL, CRXProxyMTWrapper, aProxySocket);
162 if (aResult < 0)
163 {
164 break;
165 }
166#endif
167 cout << "Thread(" << aIter + 1 << ") is created successfully." << endl;
168 }
169 /*----------------------------------------------------------------*/
170
171 return aResult;
172}
Note: See TracBrowser for help on using the repository browser.