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

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

#1 change response, threading and proxy work-flow

File size: 3.1 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 <string.h>
14
15using namespace std;
16
17#ifdef _WIN32
18# include <process.h>
19# define THREAD_TYPE void *
20# define THREAD_FUNCTION_RETURN unsigned int
21# define THREAD_FUNCTION_CALLING_CONVENTION WINAPI
22#else
23# define THREAD_TYPE pthread_t
24# define THREAD_FUNCTION_RETURN void *
25# define THREAD_FUNCTION_CALLING_CONVENTION
26#endif
27
28THREAD_FUNCTION_RETURN
29THREAD_FUNCTION_CALLING_CONVENTION
30CRXProxyMTWrapper (void * aThreadArg);
31
32int ThreadPool (CRXSocket * aProxySocket,
33 const int aThreadPoolCount);
34
35int main (int argc, char* argv[])
36{
37 int aResult = 0;
38 const short aPort = 8080;
39 const int aThreadPoolCount = 30;
40
41 CRXSocket aProxySocket;
42
43 /*----------------------------------------------------------------*/
44 /* 1. create proxy server */
45 aResult = aProxySocket.CreateServer (aPort);
46 if (aResult < 0)
47 {
48 cout << "Failed to create server." << endl;
49 return aResult;
50 }
51
52 /* 2. ready proxy servers */
53 aResult = ThreadPool (&aProxySocket, aThreadPoolCount);
54 if (aResult)
55 {
56 cout << "Failed to create thread pool." << endl;
57 return aResult;
58 }
59
60 /* 3. keep process */
61 while (true);
62
63 /*----------------------------------------------------------------*/
64 aProxySocket.Close ();
65
66 return aResult;
67}
68
69THREAD_FUNCTION_RETURN
70THREAD_FUNCTION_CALLING_CONVENTION
71CRXProxyMTWrapper (void * aThreadArg)
72{
73 int aResult = 0;
74
75 CRXSocket * aProxySocket = (CRXSocket *)aThreadArg;
76 CRXProxy * aProxy = NULL;
77
78 /*----------------------------------------------------------------*/
79 for (;;)
80 {
81 aResult = aProxySocket->Accept ();
82 if (aResult < 0)
83 {
84 cerr << "Failed to accept." << endl;
85 break;
86 }
87
88 if ((aProxy = CRXProxy::GetNewInstance ()) == NULL)
89 {
90 cerr << "Failed to get proxy." << endl;
91 aResult = -1;
92 break;
93 }
94
95 aProxy->SetClientSocket (aResult);
96
97 aResult = aProxy->Forward ();
98 if (aResult < 0)
99 {
100 cerr << aProxy->GetErrorMessage () << endl;
101 }
102
103 aProxy->ReleaseInstance ();
104 }
105
106 cerr << " thread exit." << endl;
107 /*----------------------------------------------------------------*/
108
109 return (THREAD_FUNCTION_RETURN)0;
110}
111
112int ThreadPool (CRXSocket * aProxySocket,
113 const int aThreadPoolCount)
114{
115 int aResult = 0;
116 int aIter = 0;
117 THREAD_TYPE aThreadID = (THREAD_TYPE)0;
118
119 /*----------------------------------------------------------------*/
120 for (aIter = 0 ; aIter < aThreadPoolCount ; aIter++)
121 {
122#ifdef _WIN32
123 aThreadID = (void *)_beginthreadex (0, 0, CRXProxyMTWrapper, aProxySocket, 0, 0);
124 if (aThreadID == NULL)
125 {
126 aResult = -1;
127 break;
128 }
129 CloseHandle (aThreadID);
130#else
131 aResult = pthread_create (&aThreadID, NULL, CRXProxyMTWrapper, aProxySocket);
132 if (aResult < 0)
133 {
134 break;
135 }
136#endif
137 cout << "Thread(" << aIter + 1 << ") is created successfully." << endl;
138 }
139 /*----------------------------------------------------------------*/
140
141 return aResult;
142}
Note: See TracBrowser for help on using the repository browser.