00001
00002
00003
00004
00005
00006 #ifndef __J2K__NET__TCPSOCKET_cPP__
00007 #define __J2K__NET__TCPSOCKET_cPP__
00008
00009 #include <j2k/Net/TcpSocket.hpp>
00010
00011
00012
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
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
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
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
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
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
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
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
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
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
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
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
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
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__