00001
00002
00003
00004
00005
00006 #ifndef __J2K__NET__SOCKET_CPP__
00007 #define __J2K__NET__SOCKET_CPP__
00008
00009 #include <j2k/Net/Socket.hpp>
00010
00011
00012
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
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
00051
00052
00053
00054
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
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
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__