source: cheroxy/branches/b0_1_threading/src/CRXSocket.cpp@ 7

Last change on this file since 7 was 7, checked in by cheese, 12 years ago

#1 스레딩 모듈 추가 브랜치

File size: 7.0 KB
Line 
1/**
2 * CRXSocket.cpp
3 */
4#include "CRXSocket.h"
5
6#include <string.h>
7
8#ifdef _WIN32
9# pragma comment (lib, "ws2_32.lib")
10# define close(__socket) closesocket(__socket)
11typedef int socklen_t;
12#endif
13
14bool CRXSocket::mInitialized = false;
15
16CRXSocket::CRXSocket (int aSocket)
17 : mSocket (aSocket)
18{
19 /*----------------------------------------------------------------*/
20 memset ((void *)&mAddress, 0x0, sizeof (stSockAddrIn));
21
22 if (!CRXSocket::IsInitialized ())
23 CRXSocket::Initialize ();
24 /*----------------------------------------------------------------*/
25}
26
27CRXSocket::~CRXSocket (void)
28{
29 /*----------------------------------------------------------------*/
30 Close ();
31 /*----------------------------------------------------------------*/
32}
33
34void
35CRXSocket::Attach (int aSocket)
36{
37 /*----------------------------------------------------------------*/
38 mSocket = aSocket;
39 /*----------------------------------------------------------------*/
40}
41
42int
43CRXSocket::Detach (void)
44{
45 int aSocket = mSocket;
46
47 /*----------------------------------------------------------------*/
48 mSocket = 0;
49
50 /*----------------------------------------------------------------*/
51 return aSocket;
52}
53
54void
55CRXSocket::Close (void)
56{
57 /*----------------------------------------------------------------*/
58 if (mSocket <= 0)
59 return ;
60
61 close (mSocket);
62 mSocket = 0;
63 /*----------------------------------------------------------------*/
64}
65
66CRXSocket::operator int (void) const
67{
68 /*----------------------------------------------------------------*/
69 /*----------------------------------------------------------------*/
70 return mSocket;
71}
72
73CRXSocket &
74CRXSocket::operator = (int aSocket)
75{
76 /*----------------------------------------------------------------*/
77 Attach (aSocket);
78 /*----------------------------------------------------------------*/
79 return *this;
80}
81
82int
83CRXSocket::Initialize (void)
84{
85 int aResult = 0;
86
87 /*----------------------------------------------------------------*/
88 if (CRXSocket::IsInitialized ())
89 return aResult;
90
91#ifdef WIN32
92 WSADATA aWinSockData;
93
94 aResult = WSAStartup (MAKEWORD (2, 0), &aWinSockData);
95 if (aResult != 0)
96 {
97 return ERROR_TCPSOCKET_FAILED_TO_INITIALIZE;
98 }
99#endif
100
101 mInitialized = true;
102
103 /*----------------------------------------------------------------*/
104 return aResult;
105}
106
107void
108CRXSocket::Finalize (void)
109{
110 /*----------------------------------------------------------------*/
111#ifdef WIN32
112 WSACleanup ();
113#endif
114 /*----------------------------------------------------------------*/
115}
116
117bool
118CRXSocket::IsInitialized (void)
119{
120 /*----------------------------------------------------------------*/
121 /*----------------------------------------------------------------*/
122 return mInitialized;
123}
124
125bool
126CRXSocket::IsReady (void) const
127{
128 /*----------------------------------------------------------------*/
129 /*----------------------------------------------------------------*/
130 return IsInitialized () && IsCreated ();
131}
132
133bool
134CRXSocket::IsCreated (void) const
135{
136 /*----------------------------------------------------------------*/
137 /*----------------------------------------------------------------*/
138 return mSocket > 0 ? true : false;
139}
140
141int
142CRXSocket::CreateSocket (void)
143{
144 int aResult = -1;
145
146 /*----------------------------------------------------------------*/
147 if (!IsInitialized () || IsCreated ())
148 return ERROR_TCPSOCKET_ALREADY_IN_USE;
149
150 aResult = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
151 if (aResult < 0)
152 {
153 }
154
155 mSocket = aResult;
156
157 /*----------------------------------------------------------------*/
158 return aResult;
159}
160
161int
162CRXSocket::Connect (std::string aUrl,
163 ushort aPort)
164{
165 int aResult = -1;
166 struct hostent * aHostEnt;
167
168 /*----------------------------------------------------------------*/
169 aResult = CreateSocket ();
170 if (aResult < 0)
171 {
172 return aResult;
173 }
174
175 mAddress.sin_family = AF_INET;
176 mAddress.sin_port = htons (aPort);
177 mAddress.sin_addr.s_addr = inet_addr (aUrl.c_str ());
178
179 if (mAddress.sin_addr.s_addr == (unsigned int)-1)
180 {
181 aHostEnt = gethostbyname (aUrl.c_str ());
182 if (aHostEnt == NULL)
183 {
184 return ERROR_TCPSOCKET_FAILED_TO_GET_HOSTNAME;
185 }
186 mAddress.sin_family = aHostEnt->h_addrtype;
187 memcpy (&(mAddress.sin_addr.s_addr), aHostEnt->h_addr, aHostEnt->h_length);
188 }
189
190 aResult = connect (mSocket, (stSockAddr*) &mAddress, sizeof (mAddress));
191 if (aResult < 0)
192 {
193 return ERROR_TCPSOCKET_FAILED_TO_CONNECT;
194 }
195
196 /*----------------------------------------------------------------*/
197 return aResult;
198}
199
200int
201CRXSocket::CreateServer (ushort aPort,
202 int aBacklog,
203 stSockAddrIn * aAddress)
204{
205 int aResult = -1;
206
207 /*----------------------------------------------------------------*/
208 aResult = CreateSocket ();
209 if (aResult < 0)
210 {
211 return aResult;
212 }
213
214 mAddress.sin_family = AF_INET;
215 mAddress.sin_addr.s_addr= htonl (INADDR_ANY);
216 mAddress.sin_port = htons (aPort);
217
218 aResult = bind (mSocket, (stSockAddr *)&mAddress, sizeof (stSockAddr));
219 if (aResult < 0)
220 {
221 return ERROR_TCPSOCKET_FAILED_TO_BIND;
222 }
223
224 aResult = listen (mSocket, aBacklog);
225 if (aResult < 0)
226 {
227 return ERROR_TCPSOCKET_FAILED_TO_LISTEN;
228 }
229
230 if (aAddress != NULL)
231 {
232 memset ((void *)aAddress, 0x0, sizeof (stSockAddrIn));
233 memcpy ((void *)aAddress, (void *)&mAddress, sizeof (stSockAddrIn));
234 }
235
236 /*----------------------------------------------------------------*/
237 return aResult;
238}
239
240int
241CRXSocket::Accept (stSockAddrIn * aRemoteAddress,
242 int * aAddressLength)
243{
244 int aResult = -1;
245
246 stSockAddrIn aAddress;
247 socklen_t aLength = sizeof (aAddress);
248
249 /*----------------------------------------------------------------*/
250 if (!IsReady ()) return ERROR_TCPSOCKET_NOT_READY;
251
252 aResult = accept (mSocket, (stSockAddr *) &aAddress, &aLength);
253 if (aResult < 0)
254 {
255 return aResult;
256 }
257
258 if (aRemoteAddress != NULL)
259 {
260 memset ((void *)aRemoteAddress, 0x0, sizeof (stSockAddrIn));
261 memcpy ((void *)aRemoteAddress, (void *)&aAddress, sizeof (stSockAddrIn));
262 }
263
264 if (aAddressLength != NULL)
265 *aAddressLength = aLength;
266
267 /*----------------------------------------------------------------*/
268 return aResult;
269}
270
271int
272CRXSocket::Send (char * aBuffer,
273 int aSize)
274{
275 int aResult = -1;
276
277 /*----------------------------------------------------------------*/
278 if (!IsReady ()) return ERROR_TCPSOCKET_NOT_READY;
279
280 aResult = send (mSocket, aBuffer, aSize, 0);
281 if (aResult != aSize)
282 {
283 return ERROR_TCPSOCKET_FAILED_TO_SEND;
284 }
285
286 /*----------------------------------------------------------------*/
287 return aResult;
288}
289
290int
291CRXSocket::Receive (char * aBuffer,
292 int aSize)
293{
294 int aResult = -1;
295
296 /*----------------------------------------------------------------*/
297 if (!IsReady ()) return ERROR_TCPSOCKET_NOT_READY;
298
299 aResult = recv (mSocket, aBuffer, aSize, 0);
300 if (aResult < 0)
301 {
302 return ERROR_TCPSOCKET_FAILED_TO_RECEIVE;
303 }
304
305 /*----------------------------------------------------------------*/
306 return aResult;
307}
Note: See TracBrowser for help on using the repository browser.