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

C:/temp/src/j2k/Net/ServerSocket.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__SERVERSOCKET_CPP__
00007 #define __J2K__NET__SERVERSOCKET_CPP__
00008 
00009 #include <j2k/Net/ServerSocket.hpp>
00010 
00011 //
00012 // CONSTRUCTORS
00013 //
00014 
00015 ServerSocket::ServerSocket( sockaddr* sa = NULL, int domain = PF_INET, int type = SOCK_STREAM, int protocol = 0) throw (int)
00016 {
00017   s_domain   = domain;
00018   s_type     = type;
00019   s_protocol = protocol;
00020   lsa        = NULL;
00021 
00022   sck = socket(domain,type,protocol);
00023   
00024   if( sck == -1 ) 
00025   {
00026     throw errno;
00027   }
00028   else {
00029     if(sa != NULL) {
00030       local_sa.sa_family = sa->sa_family;
00031       for (int i = 0;i<14;i++) local_sa.sa_data[i] = sa->sa_data[i];
00032       lsa = &local_sa;
00033     }
00034     else {
00035        /*
00036       local_sa.sa_family = AF_INET;
00037       memset(&(local_sa.sa_data), '\0', 14);
00038       ((struct sockaddr_in*)local_sa).sin_port = htons(0);
00039       ((struct sockaddr_in)local_Sa).sin_addr.s_addr = htonl(INADDR_ANY);
00040       lsa = &local_sa;
00041   */
00042     }
00043   }
00044 }
00045   
00046 ServerSocket::ServerSocket(ServerSocket& original) throw (int)
00047 {
00048   struct sockaddr* tmp;
00049   
00050   s_domain   = original.getDomain();
00051   s_type     = original.getType();
00052   s_protocol = original.getProtocol();
00053   
00054   sck = socket(s_domain,s_type,s_protocol);
00055   if(sck == -1) 
00056   {
00057     throw errno;
00058   }
00059   else 
00060   {
00061     tmp = original.getSockAddr();
00062     local_sa.sa_family = tmp->sa_family;
00063     for (int i = 0;i<14;i++) local_sa.sa_data[i] = tmp->sa_data[i];
00064     lsa = &local_sa;
00065   }
00066 }
00067 
00068 //
00069 // METHODS
00070 //
00071 
00072 int ServerSocket::bind(struct sockaddr* sa = NULL)
00073 {
00074   int ret;
00075   
00076   if (sa != NULL) 
00077   {
00078     local_sa.sa_family = sa->sa_family;
00079     for (int i = 0;i<14;i++) local_sa.sa_data[i] = sa->sa_data[i];
00080     lsa = &local_sa;
00081   }
00082     
00083   ret = ::bind(sck, lsa, sizeof(struct sockaddr));
00084   
00085   return ret;
00086 }
00087   
00088 int ServerSocket::listen(int bklog = 4)
00089 {
00090   int i;
00091   backlog = bklog;
00092   
00093   i = ::listen(sck, backlog);
00094 
00095   return i;
00096 }
00097 
00098 Socket* ServerSocket::accept() throw(int)
00099 {
00100   int i;
00101   struct sockaddr remote_sa;
00102   struct sockaddr *rsa = &remote_sa;
00103 
00104   Socket *ret;
00105   socklen_t sorsa = sizeof(struct sockaddr);
00106   
00107   i = ::accept(sck, rsa, &sorsa);
00108   
00109   if (i == -1) {
00110     throw(errno);
00111   }
00112   else {
00113     ret = new Socket(i,s_domain, s_type, s_protocol);
00114     return ret;
00115   }
00116 }
00117 
00118 void ServerSocket::close()
00119 {
00120   ::close(sck);
00121 }
00122     
00123 void ServerSocket::shutdown(int how = 2)
00124 {
00125   ::shutdown(sck, how);
00126 }
00127 
00128 void ServerSocket::shutdownInput()
00129 {
00130   ::shutdown(sck, 0);
00131 }
00132 
00133 void ServerSocket::shutdownOutput()
00134 {
00135   ::shutdown(sck, 1);
00136 }
00137 
00138 struct sockaddr* ServerSocket::getSockAddr()
00139 {
00140   int size = sizeof(struct sockaddr);
00141   getsockname(sck, lsa, (socklen_t *) &size);
00142   return lsa;
00143 }
00144     
00145 int ServerSocket::getSocket()
00146 {
00147   return sck;
00148 }
00149 
00150 int ServerSocket::getDomain()
00151 {
00152   return s_domain;
00153 }
00154 
00155 int ServerSocket::getType()
00156 {
00157   return s_type;
00158 }
00159 
00160 int ServerSocket::getProtocol()
00161 {
00162   return s_protocol;
00163 }
00164 
00165 int ServerSocket::setSockOpt(int level, int optname, void* optval, socklen_t optlen)
00166 {
00167   int ret;
00168   ret = setsockopt(sck, level, optname, optval, optlen);
00169   return ret;
00170 }
00171 
00172        
00173 void* ServerSocket::getSockOpt(int level, int optname, void* optval, socklen_t* optlen)
00174 {
00175   int ret;
00176   ret = getsockopt(sck, level, optname, optval, optlen);
00177   if (ret != -1)
00178   {
00179     return optval;
00180   }
00181   else
00182   {
00183     return NULL;
00184   }
00185 }
00186 
00187 
00188 #endif //__J2K__NET__SERVERSSOCKET_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