#include <vsisocket.h>
Public Member Functions | |
CvsiTCPwait () | |
~CvsiTCPwait () | |
int | Initialize (vsiIPaddress *LocalAddress, int Backlog) |
int | Close () |
int | IsOpen () |
int | Accept (CvsiTCPsocket *TCPsocket, vsiIPaddress *Source) |
Private Attributes | |
int | m_Socket |
Definition at line 71 of file vsisocket.h.
CvsiTCPwait::CvsiTCPwait | ( | ) |
Definition at line 236 of file vsisocket.cpp.
00237 { 00238 m_Socket = VSI_INVALID_SOCKET; 00239 }
CvsiTCPwait::~CvsiTCPwait | ( | ) |
Definition at line 241 of file vsisocket.cpp.
00242 { 00243 if(m_Socket != VSI_INVALID_SOCKET) 00244 { 00245 Close(); 00246 } 00247 }
int CvsiTCPwait::Accept | ( | CvsiTCPsocket * | TCPsocket, | |
vsiIPaddress * | Source | |||
) |
Definition at line 329 of file vsisocket.cpp.
00330 { 00331 struct sockaddr_in From; 00332 00333 00334 if(m_Socket == VSI_INVALID_SOCKET) 00335 { 00336 return VSI_ERROR_SOCKET_NOT_OPEN; 00337 } 00338 00339 if(TCPsocket->m_Socket != VSI_INVALID_SOCKET) 00340 { 00341 return VSI_ERROR_SOCKET_INUSE; 00342 } 00343 00344 unsigned int n= sizeof(From); 00345 int sock = accept( m_Socket, (sockaddr* )&From, &n); 00346 00347 if(sock < 0) 00348 { 00349 return VSI_ERROR_SOCKET_ACCEPT; 00350 } 00351 00352 if(Source != 0) 00353 { 00354 Source->Host = From.sin_addr.s_addr; 00355 Source->Port = From.sin_port; 00356 } 00357 00358 TCPsocket->m_Socket = sock; 00359 00360 return 0; 00361 }
int CvsiTCPwait::Close | ( | void | ) |
Definition at line 316 of file vsisocket.cpp.
00317 { 00318 if(m_Socket != VSI_INVALID_SOCKET) 00319 { 00320 close(m_Socket); 00321 m_Socket = VSI_INVALID_SOCKET; 00322 return (0); 00323 } 00324 return VSI_ERROR_SOCKET_NOT_OPEN; 00325 }
int CvsiTCPwait::Initialize | ( | vsiIPaddress * | LocalAddress, | |
int | Backlog | |||
) |
Definition at line 261 of file vsisocket.cpp.
00262 { 00263 int sock; 00264 struct sockaddr_in myaddress; 00265 00266 if(m_Socket != VSI_INVALID_SOCKET) 00267 { 00268 Close(); 00269 } 00270 00271 // create TCP socket 00272 sock = socket (AF_INET, SOCK_STREAM, 0); 00273 if(sock < 0 ) 00274 { 00275 return VSI_ERROR_SOCKET_CREATION; 00276 } 00277 00278 // ### set SO_REUSEADDR option so can reopen even if old sessions exist 00279 int flag = 1; 00280 int rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); 00281 00282 if( rc != 0 ) 00283 { 00284 RioErr << "Error on setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, ...): " 00285 << rc << endl; 00286 } 00287 00288 // Initialize local address 00289 myaddress.sin_family = AF_INET; 00290 myaddress.sin_port = LocalAddress->Port; 00291 00292 if(LocalAddress->Host == VSI_SOCKET_UNDEFINED_IP_ADDRESS) 00293 myaddress.sin_addr.s_addr = INADDR_ANY; 00294 else 00295 myaddress.sin_addr.s_addr = LocalAddress->Host; 00296 00297 // bind socket to local IP address 00298 if( bind (sock,(sockaddr *) &myaddress,sizeof(myaddress)) < 0) 00299 { 00300 close (sock); 00301 return VSI_ERROR_SOCKET_BIND; 00302 } 00303 00304 if( listen (sock, Backlog) < 0) 00305 { 00306 close (sock); 00307 return VSI_ERROR_SOCKET_LISTEN; 00308 } 00309 00310 m_Socket = sock; 00311 return (0); 00312 }
int CvsiTCPwait::IsOpen | ( | ) |
Definition at line 251 of file vsisocket.cpp.
00252 { 00253 if(m_Socket == VSI_INVALID_SOCKET) 00254 return false; 00255 else 00256 return true; 00257 }
int CvsiTCPwait::m_Socket [private] |
Definition at line 81 of file vsisocket.h.