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

C:/temp/src/j2k/Net/Socket.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__SOCKET_CPP__
00007 #define __J2K__NET__SOCKET_CPP__
00008 
00009 #include <j2k/Net/Socket.hpp>
00010 
00011 //
00012 // CONSTRUCTORS
00013 //
00014 
00015 Socket::Socket( sockaddr* sa = NULL, 
00016                 int domain   = PF_INET, 
00017                 int type     = SOCK_STREAM, 
00018                 int protocol = 0
00019 ) throw (int)
00020 {
00021   s_domain   = domain;
00022   s_type     = type;
00023   s_protocol = protocol;
00024 
00025   rsa = NULL;
00026   lsa = NULL;
00027 
00028   sck = socket( domain, type, protocol );
00029   
00030   if(sck == -1) 
00031   {
00032     throw errno;
00033   }
00034   else 
00035   {
00036     if(sa != NULL) 
00037     {
00038       local_sa.sa_family = sa->sa_family;
00039 
00040       // NOTICE: Can't you use memcpy() instead ?!
00041       for ( register int i = 0; i < 14; i++ ) 
00042       {
00043         local_sa.sa_data[i] = sa->sa_data[i];
00044       }
00045 
00046       lsa = &local_sa;
00047     }
00048     else 
00049     {
00050 /*    local_sa.sa_family = AF_INET;
00051       memset(&(local_sa.sa_data), '\0', 14);
00052       ((struct sockaddr_in*)local_sa).sin_port = htons(0);
00053       ((struct sockaddr_in)local_Sa).sin_addr.s_addr = htonl(INADDR_ANY);
00054       lsa = &local_sa; 
00055 */
00056     }
00057   }
00058 }
00059   
00060 Socket::Socket(Socket& original) throw (int)
00061 {
00062   struct sockaddr* tmp;
00063   
00064   s_domain   = original.getDomain();
00065   s_type     = original.getType();
00066   s_protocol = original.getProtocol();
00067   
00068   sck = socket(s_domain,s_type,s_protocol);
00069   if(sck == -1) 
00070   {
00071     throw errno;
00072   }
00073   else 
00074   {
00075     tmp = original.getLocalSockAddr();
00076     local_sa.sa_family = tmp->sa_family;
00077     for (int i = 0;i<14;i++) local_sa.sa_data[i] = tmp->sa_data[i];
00078     tmp = original.getSockAddr();
00079     remote_sa.sa_family = tmp->sa_family;
00080     for (int i = 0;i<14;i++) remote_sa.sa_data[i] = tmp->sa_data[i];
00081     lsa = &local_sa;
00082     rsa = &remote_sa;
00083   }
00084 }
00085 
00086 Socket::Socket( int set_socket, 
00087                 int domain   = PF_INET, 
00088                 int type     = SOCK_STREAM, 
00089                 int protocol = 0
00090 ) throw(int)
00091 {
00092   s_domain   = domain;
00093   s_type     = type;
00094   s_protocol = protocol;
00095 
00096   lsa = NULL;
00097   rsa = NULL;
00098   sck = set_socket;
00099   int i;
00100   socklen_t socksize = sizeof(struct sockaddr);
00101   
00102   i = getsockname(sck,&local_sa,&socksize);
00103   if (i == -1) 
00104   {
00105     throw errno;
00106   }
00107   else 
00108   {
00109     lsa = &local_sa;
00110     socksize = sizeof(struct sockaddr);
00111     i = getpeername(sck,&remote_sa,&socksize);
00112     if ((i == -1) && (errno != ENOTCONN)) 
00113     {
00114       throw errno;
00115     }
00116     else 
00117     {
00118       rsa = &remote_sa;
00119     }
00120   }
00121 }
00122       
00123 
00124 //
00125 // METHODS
00126 //
00127 
00128 int Socket::bind(struct sockaddr* sa = NULL)
00129 {
00130   int ret;
00131   
00132   if (sa != NULL) 
00133   {
00134     local_sa.sa_family = sa->sa_family;
00135     for (int i = 0;i<14;i++) local_sa.sa_data[i] = sa->sa_data[i];
00136     rsa = &local_sa;
00137   }
00138     
00139   ret = ::bind(sck, lsa, sizeof(struct sockaddr));
00140   
00141   return ret;
00142 }
00143   
00144 int Socket::connect(struct sockaddr* sa = NULL)
00145 {
00146   int ret;
00147   
00148   if (sa != NULL) 
00149   {
00150     remote_sa.sa_family = sa->sa_family;
00151     for (int i = 0;i<14;i++) remote_sa.sa_data[i] = sa->sa_data[i];
00152     rsa = &local_sa;
00153   }
00154   
00155   ret = ::connect(sck, rsa, sizeof(struct sockaddr));
00156 
00157   return ret;
00158 }
00159   
00160 void Socket::close()
00161 {
00162   ::close(sck);
00163 }
00164     
00165 void Socket::shutdown(int how = 2)
00166 {
00167   ::shutdown(sck, how);
00168 }
00169 
00170 void Socket::shutdownInput()
00171 {
00172   ::shutdown(sck, 0);
00173 }
00174 
00175 void Socket::shutdownOutput()
00176 {
00177   ::shutdown(sck, 1);
00178 }
00179 
00180 struct sockaddr* Socket::getSockAddr()
00181 {
00182   int size = sizeof(struct sockaddr);
00183   getpeername(sck, rsa, (socklen_t *) &size);
00184   return rsa;
00185 }
00186 
00187 struct sockaddr* Socket::getLocalSockAddr()
00188 {
00189   int size = sizeof(struct sockaddr);
00190   getsockname(sck, lsa, (socklen_t *) &size);
00191   return lsa;
00192 }
00193     
00194 int Socket::getSocket()
00195 {
00196   return sck;
00197 }
00198 
00199 int Socket::getDomain()
00200 {
00201   return s_domain;
00202 }
00203 
00204 int Socket::getType()
00205 {
00206   return s_type;
00207 }
00208 
00209 int Socket::getProtocol()
00210 {
00211   return s_protocol;
00212 }
00213 
00214 int Socket::setSockOpt(int level, int optname, void* optval, socklen_t optlen)
00215 {
00216   int ret;
00217   ret = setsockopt(sck, level, optname, optval, optlen);
00218   return ret;
00219 }
00220 
00221        
00222 void* Socket::getSockOpt(int level, int optname, void* optval, socklen_t* optlen)
00223 {
00224   int ret;
00225   ret = getsockopt(sck, level, optname, optval, optlen);
00226   if (ret != -1)
00227   {
00228     return optval;
00229   }
00230   else
00231   {
00232     return NULL;
00233   }
00234 }
00235 
00236 int Socket::read(void * buffer, size_t len, int flags = 0)
00237 {
00238    int l  = len;
00239    l = recv(sck,buffer, len, flags);
00240    return l;
00241 }
00242 
00243 // return -1 and set errno on error 
00244 int Socket::send(void * buffer, size_t len, int flags = 0)
00245 {
00246    int l  = len;
00247    l = ::send(sck,buffer, len, flags);
00248    return l;
00249 }
00250 
00251 #endif //__J2K__NET__SOCKET_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