#include <vsisocket.h>
Public Member Functions | |
CvsiTCPsocket () | |
~CvsiTCPsocket () | |
int | Connect (vsiIPaddress *Target) |
int | Close () |
int | IsOpen () |
int | Send (char *Buffer, int Size) |
int | Receive (char *Buffer, int Size) |
Private Attributes | |
int | m_Socket |
Friends | |
class | CvsiTCPwait |
Definition at line 54 of file vsisocket.h.
CvsiTCPsocket::CvsiTCPsocket | ( | ) |
Definition at line 375 of file vsisocket.cpp.
00376 { 00377 m_Socket = VSI_INVALID_SOCKET; 00378 }
CvsiTCPsocket::~CvsiTCPsocket | ( | ) |
Definition at line 380 of file vsisocket.cpp.
00381 { 00382 if(m_Socket != VSI_INVALID_SOCKET) 00383 { 00384 Close(); 00385 } 00386 }
int CvsiTCPsocket::Close | ( | void | ) |
Definition at line 437 of file vsisocket.cpp.
00438 { 00439 if(m_Socket != VSI_INVALID_SOCKET) 00440 { 00441 shutdown( m_Socket, SHUT_RDWR ); 00442 close(m_Socket); 00443 m_Socket = VSI_INVALID_SOCKET; 00444 return (0); 00445 } 00446 return VSI_ERROR_SOCKET_NOT_OPEN; 00447 }
int CvsiTCPsocket::Connect | ( | vsiIPaddress * | Target | ) |
Definition at line 400 of file vsisocket.cpp.
00401 { 00402 int sock; 00403 struct sockaddr_in dest; 00404 00405 if( m_Socket != VSI_INVALID_SOCKET ) 00406 { 00407 Close(); 00408 } 00409 00410 // create TCP socket 00411 sock = socket (AF_INET, SOCK_STREAM, 0); 00412 if( sock < 0 ) 00413 { 00414 RioErr << "[vsisocket] Erro no socket: " << strerror(errno) << endl; 00415 return VSI_ERROR_SOCKET_CREATION; 00416 } 00417 00418 // Initialize local address 00419 dest.sin_family = AF_INET; 00420 dest.sin_addr.s_addr = Target->Host; 00421 dest.sin_port = Target->Port; 00422 00423 // connect socket to remote socket 00424 if( connect ( sock, (sockaddr *) &dest, sizeof( dest ) ) < 0 ) 00425 { 00426 RioErr << "[vsisocket] Erro no connect: " << strerror(errno) << endl; 00427 close (sock); 00428 return VSI_ERROR_SOCKET_CONNECT; 00429 } 00430 00431 m_Socket = sock; 00432 return( 0 ); 00433 }
int CvsiTCPsocket::IsOpen | ( | ) |
Definition at line 390 of file vsisocket.cpp.
00391 { 00392 if(m_Socket == VSI_INVALID_SOCKET) 00393 return false; 00394 else 00395 return true; 00396 }
int CvsiTCPsocket::Receive | ( | char * | Buffer, | |
int | Size | |||
) |
Definition at line 490 of file vsisocket.cpp.
00491 { 00492 00493 if(m_Socket == VSI_INVALID_SOCKET) 00494 { 00495 return VSI_ERROR_SOCKET_NOT_OPEN; 00496 } 00497 00498 00499 int nb; 00500 int nrecv = 0; 00501 char* bf = Buffer; 00502 00503 // loop while not all bytes sent 00504 // (see comment bellow) 00505 while(1) 00506 { 00507 nb = recv ( m_Socket, bf, nBytes-nrecv, MSG_NOSIGNAL ); 00508 // Check if there was an error 00509 if(nb <= 0) 00510 { 00511 Rioperror("CvsiTCPsocket::Receive()"); 00512 00513 return VSI_ERROR_SOCKET_RECV; 00514 } 00515 else 00516 { 00517 nrecv+=nb; 00518 bf+=nb; 00519 // This should be "==". Use ">=" just in case, to avoid infinity loop 00520 if(nrecv >= nBytes) 00521 { 00522 return 0; 00523 } 00524 } 00525 } 00526 00527 return (0); 00528 00529 }
int CvsiTCPsocket::Send | ( | char * | Buffer, | |
int | Size | |||
) |
Definition at line 451 of file vsisocket.cpp.
00452 { 00453 if(m_Socket == VSI_INVALID_SOCKET) 00454 { 00455 return VSI_ERROR_SOCKET_NOT_OPEN; 00456 } 00457 00458 int nb; 00459 int nsent = 0; 00460 char *bf = Buffer; 00461 00462 // loop while not all bytes sent 00463 // (see comment bellow) 00464 while( true ) 00465 { 00466 nb = send ( m_Socket, bf, nBytes-nsent, MSG_NOSIGNAL ); 00467 00468 // Check if there was an error 00469 if( nb < 0 ) 00470 { 00471 return VSI_ERROR_SOCKET_SEND; 00472 } 00473 else 00474 { 00475 nsent+=nb; 00476 bf+=nb; 00477 // This should be "==". Use ">=" just in case, to avoid 00478 //infinity loop 00479 if(nsent >= nBytes) 00480 { 00481 return 0; 00482 } 00483 } 00484 } 00485 }
friend class CvsiTCPwait [friend] |
Definition at line 57 of file vsisocket.h.
int CvsiTCPsocket::m_Socket [private] |
Definition at line 67 of file vsisocket.h.