00001
00002
00003
00004
00005
00006 #ifndef __J2K__NET__SERVERSOCKET_CPP__
00007 #define __J2K__NET__SERVERSOCKET_CPP__
00008
00009 #include <j2k/Net/ServerSocket.hpp>
00010
00011
00012
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
00037
00038
00039
00040
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
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__