Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Net/TcpSocket.cpp

Go to the documentation of this file.
00001 // Wolf for J2K Library
00002 // LGPL Licensed.
00003 // http://j2k.sourceforge.net/
00004 // Revision #1: Fred P. - Oct 2nd, 2001
00005 
00006 #ifndef __J2K__NET__TCPSOCKET_cPP__
00007 #define __J2K__NET__TCPSOCKET_cPP__
00008 
00009 #include <j2k/Net/TcpSocket.hpp>
00010 
00011 //
00012 // CONSTRUCTORS
00013 //
00014 
00015 TcpSocket::TcpSocket(int port = 0)  throw(int)
00016   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00017 {
00018   struct sockaddr_in *s_in = (struct sockaddr_in *)lsa;
00019   remoteAddress = NULL;
00020   remotePort = 0;
00021   localPort = port;
00022   s_in->sin_family = AF_INET;
00023   s_in->sin_port = htons(localPort);
00024   s_in->sin_addr.s_addr = htonl(INADDR_ANY);
00025   memset(&(s_in->sin_zero), '\0', 8);
00026   bind();
00027 }
00028 
00029 TcpSocket::TcpSocket(Socket &original) throw(int)
00030   : Socket( original.getSocket(), PF_INET, SOCK_STREAM, 0 )
00031 {
00032   
00033 }
00034   
00035 TcpSocket::TcpSocket(InetAddress& address, int port = 0) throw(int)
00036   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00037 {
00038   struct sockaddr_in *s_in = (struct sockaddr_in *)lsa;
00039   remoteAddress = NULL;
00040   remotePort = 0;
00041   localPort = port;
00042   s_in->sin_family = AF_INET;
00043   s_in->sin_port = htons(localPort);
00044   s_in->sin_addr.s_addr = address.getAddress2();
00045   memset(&(s_in->sin_zero), '\0', 8);
00046   bind();
00047 }
00048 
00049 TcpSocket::TcpSocket(InetAddress& remoteAddr, int remotePort, InetAddress& localAddress, int localPort) throw(int)
00050   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00051 {
00052   struct sockaddr_in *ls_in = (struct sockaddr_in *)lsa, *rs_in = (struct sockaddr_in *)rsa;
00053   this->localPort = localPort;
00054   ls_in->sin_family = AF_INET;
00055   ls_in->sin_port = htons(this->localPort);
00056   ls_in->sin_addr.s_addr = localAddress.getAddress2();
00057   memset(&(ls_in->sin_zero), '\0', 8);
00058   bind();
00059   remoteAddress = new InetAddress(remoteAddr);
00060   this->remotePort = remotePort;
00061    ls_in->sin_family = AF_INET;
00062   ls_in->sin_port = htons(this->remotePort);
00063   ls_in->sin_addr.s_addr = remoteAddress->getAddress2();
00064   memset(&(ls_in->sin_zero), '\0', 8);
00065   connect();
00066 }
00067 
00068 #ifdef USE_JSTRING
00069 TcpSocket::TcpSocket(JString &host, int port) throw(int)
00070   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00071 {
00072   struct sockaddr_in *s_in = (struct sockaddr_in *)lsa;
00073   InetAddress *I = new InetAddress(host);
00074   remoteAddress = NULL;
00075   remotePort = 0;
00076   localPort = port;
00077   s_in->sin_family = AF_INET;
00078   s_in->sin_port = htons(localPort);
00079   s_in->sin_addr.s_addr = I->getAddress2();
00080   memset(&(s_in->sin_zero), '\0', 8);
00081   bind();
00082   delete I;
00083 }
00084 
00085 TcpSocket::TcpSocket(JString &remoteHost, int remotePort, InetAddress& localAddress, int localPort) throw(int)
00086   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00087 {
00088   struct sockaddr_in *ls_in = (struct sockaddr_in *)lsa, *rs_in = (struct sockaddr_in *)rsa;
00089   InetAddress *remoteAddr = new InetAddress(remoteHost);
00090   this->localPort = localPort;
00091   ls_in->sin_family = AF_INET;
00092   ls_in->sin_port = htons(this->localPort);
00093   ls_in->sin_addr.s_addr = localAddress.getAddress2();
00094   memset(&(ls_in->sin_zero), '\0', 8);
00095   bind();
00096   this->remotePort = remotePort;
00097   ls_in->sin_family = AF_INET;
00098   ls_in->sin_port = htons(this->remotePort);
00099   ls_in->sin_addr.s_addr = remoteAddress->getAddress2();
00100   memset(&(ls_in->sin_zero), '\0', 8);
00101   connect();
00102   delete remoteAddr;
00103 }
00104 #else
00105 TcpSocket::TcpSocket(char *host, int port) throw(int)
00106   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00107 {
00108   struct sockaddr_in *s_in = (struct sockaddr_in *)lsa;
00109   InetAddress *I = new InetAddress(host);
00110   remoteAddress = NULL;
00111   remotePort = 0;
00112   localPort = port;
00113   s_in->sin_family = AF_INET;
00114   s_in->sin_port = htons(localPort);
00115   s_in->sin_addr.s_addr = I->getAddress2();
00116   memset(&(s_in->sin_zero), '\0', 8);
00117   bind();
00118   delete I;
00119 }
00120   
00121 TcpSocket::TcpSocket(char *remoteHost, int remotePort, InetAddress& localAddress, int localPort) throw(int)
00122   : Socket((struct sockaddr *)NULL, PF_INET, SOCK_STREAM, 0)
00123 {
00124   struct sockaddr_in *ls_in = (struct sockaddr_in *)lsa, *rs_in = (struct sockaddr_in *)rsa;
00125   InetAddress *remoteAddr = new InetAddress(remoteHost);
00126   this->localPort = localPort;
00127   ls_in->sin_family = AF_INET;
00128   ls_in->sin_port = htons(this->localPort);
00129   ls_in->sin_addr.s_addr = localAddress.getAddress2();
00130   memset(&(ls_in->sin_zero), '\0', 8);
00131   bind();
00132   this->remotePort = remotePort;
00133   ls_in->sin_family = AF_INET;
00134   ls_in->sin_port = htons(this->remotePort);
00135   ls_in->sin_addr.s_addr = remoteAddress->getAddress2();
00136   memset(&(ls_in->sin_zero), '\0', 8);
00137   connect();
00138   delete remoteAddr;
00139 }
00140 #endif    
00141 
00142 //
00143 // METHODS
00144 //
00145 
00146 InetAddress TcpSocket::getLocalAddress() const
00147 {  
00148   InetAddress I(inet_ntoa(((struct sockaddr_in*)lsa)->sin_addr));
00149   return I;
00150 }
00151     
00152 InetAddress TcpSocket::getInetAddress() const
00153 {  
00154   return *remoteAddress;
00155 }
00156 
00157 #ifdef USE_JSTRING
00158 JString TcpSocket::getLocalHost() const
00159 {
00160   JString S(inet_ntoa(((struct sockaddr_in*)lsa)->sin_addr));
00161    return S;
00162 }
00163 
00164 inline JString TcpSocket::getHost() const
00165 {
00166   return remoteAddress->getHostName();
00167 }
00168 #else
00169 const char* TcpSocket::getLocalHost() const
00170 {
00171   return inet_ntoa(((struct sockaddr_in*)lsa)->sin_addr);
00172 }
00173 
00174 inline const char*  TcpSocket::getHost() const
00175 {
00176   return remoteAddress->getHostName();
00177 }
00178 #endif
00179 
00180 inline int TcpSocket::getLocalPort() const
00181 {
00182   return localPort;
00183 }
00184 
00185 inline int TcpSocket::getPort() const
00186 {
00187   return remotePort;
00188 }
00189 
00190 
00191 int TcpSocket::setTcpNoDelay(BOOL on)
00192 {
00193   struct protoent *pe;
00194    
00195   pe = getprotobyname("TCP");
00196   if(setSockOpt(pe->p_proto,TCP_NODELAY,(void *)&on,sizeof(int)) != 0) {
00197 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00198      return -1;
00199   }
00200   return 0;
00201 }
00202   
00203 int TcpSocket::setSoLinger(BOOL on, int linger)
00204 {
00205   struct linger lin;
00206   lin.l_onoff = on;
00207   lin.l_linger = linger;
00208   if(setSockOpt(SOL_SOCKET,SO_LINGER,(void *)&lin,sizeof(struct linger)) != 0)
00209      return -1;
00210 //     perror("TcpSocket::setSoLinger() FAIL");
00211   
00212   return 0;
00213 }  
00214 
00215 int TcpSocket::setSoTimeout(int timeout)
00216 {
00217 #if 0
00218   if(setSockOpt(SOL_SOCKET,SO_TIMEOUT,(void *)&timeout,sizeof(int)) != 0)
00219      return -1;
00220 //     perror("TcpSocket::setSoTimeout() FAIL");
00221   
00222   return 0;
00223 #else
00224    errno = EBADF;
00225    return -1;
00226 #endif
00227    
00228 }
00229 
00230 int TcpSocket::setSendBufferSize(int size)
00231 {
00232   if(setSockOpt(SOL_SOCKET,SO_SNDBUF,(void *)&size,sizeof(int)) != 0) {
00233 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00234      return -1;
00235   }
00236   return 0;
00237 }
00238 
00239 int TcpSocket::setRecieveBufferSize(int size)
00240 {
00241   if(setSockOpt(SOL_SOCKET,SO_RCVBUF,(void *)&size,sizeof(int)) != 0) {
00242 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00243      return -1;
00244   }
00245   return 0;
00246 }
00247 
00248 int TcpSocket::setKeepAlive(BOOL on)
00249 {
00250   if(setSockOpt(SOL_SOCKET,SO_KEEPALIVE,(void *)&on,sizeof(int)) != 0) {
00251 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00252      return -1;
00253   }
00254   return 0;
00255 }
00256   
00257 
00258 
00259 BOOL TcpSocket::getTcpNoDelay()
00260 {
00261   struct protoent *pe;
00262   BOOL ret = false;
00263   int rets = sizeof(int);
00264    
00265   pe = getprotobyname("TCP");
00266   if(getSockOpt(pe->p_proto,TCP_NODELAY,(void *)&ret,(socklen_t*)&rets) != 0) {
00267 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00268      return false; 
00269   }
00270   return ret;
00271 }
00272 
00273 int TcpSocket::getSoLinger()
00274 {
00275   struct linger ret;
00276   ret.l_onoff = 0;
00277   ret.l_linger = 0;
00278   int rets =  sizeof(int);
00279   if(setSockOpt(SOL_SOCKET,SO_LINGER,(void *)&ret,rets) != 0)
00280     return -1;
00281 //     perror("TcpSocket::setSoLinger() FAIL");
00282   if(rets != sizeof(struct linger))
00283     return 0;
00284   if((BOOL)ret.l_onoff == false)
00285      return 0;
00286   return ret.l_linger;;
00287 }
00288 
00289 int TcpSocket::getSoTimeout()
00290 {
00291    return -1;
00292 }
00293 
00294 int TcpSocket::getSendBufferSize()
00295 {
00296   int ret = 0;
00297   int rets = sizeof(int);
00298   if(getSockOpt(SOL_SOCKET,SO_SNDBUF,(void *)&ret,(socklen_t *) &rets) != 0) {
00299 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00300      return -1;
00301   }
00302   return ret;   
00303 }
00304 
00305 int TcpSocket::getRecieveBufferSize()
00306 {
00307   int ret = 0;
00308   int rets = sizeof(int);
00309   if(getSockOpt(SOL_SOCKET,SO_RCVBUF,(void *)&ret,(socklen_t *) &rets) != 0) {
00310 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00311      return -1;
00312   }
00313   return ret;   
00314 }
00315 
00316 BOOL TcpSocket::getKeepAlive()
00317 {
00318   int ret = 0;
00319   int rets = sizeof(int);
00320   if(getSockOpt(SOL_SOCKET,SO_KEEPALIVE,(void *)&ret,(socklen_t *) &rets) != 0) {
00321 //    perror("TcpSocket::setTcpNoDelay() FAIL");
00322      return -1;
00323   }
00324   return ret;   
00325 }
00326 
00327 int TcpSocket::read(char * buffer, size_t len, int flags = 0)
00328 {
00329    int l  = len;
00330    l = recv(sck,(void  *)buffer, len, flags);
00331    return l;
00332 }
00333 
00334 // return -1 and set errno on error 
00335 int TcpSocket::send(char * buffer, size_t len, int flags = 0)
00336 {
00337    int l  = len;
00338    l = ::send(sck,(void  *)buffer, len, flags);
00339    return l;
00340 }
00341 
00342 #endif //__J2K__NET__TCPSOCKET_cPP__

Generated on Sun Oct 14 18:46:33 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001