CvsiTCPsocket Class Reference

#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

Detailed Description

Definition at line 54 of file vsisocket.h.


Constructor & Destructor Documentation

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 }


Member Function Documentation

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 }


Friends And Related Function Documentation

friend class CvsiTCPwait [friend]

Definition at line 57 of file vsisocket.h.


Field Documentation

int CvsiTCPsocket::m_Socket [private]

Definition at line 67 of file vsisocket.h.


The documentation for this class was generated from the following files:
Generated on Wed Jul 4 16:03:34 2012 for RIO by  doxygen 1.6.3