00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackSocket.h"
00021 #include "JackTools.h"
00022 #include "JackError.h"
00023 #include <string.h>
00024 #include <stdio.h>
00025 #include <pthread.h>
00026
00027 namespace Jack
00028 {
00029
00030 JackClientSocket::JackClientSocket(int socket): fSocket(socket)
00031 {}
00032
00033 void JackClientSocket::SetReadTimeOut(long sec)
00034 {
00035 struct timeval timout;
00036 timout.tv_sec = sec;
00037 timout.tv_usec = 0;
00038 if (setsockopt(fSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timout, sizeof(timeval)) < 0) {
00039 jack_error("SetReadTimeOut fd = %ld err = %s", fSocket, strerror(errno));
00040 }
00041 }
00042
00043 void JackClientSocket::SetWriteTimeOut(long sec)
00044 {
00045 struct timeval timout;
00046 timout.tv_sec = sec ;
00047 timout.tv_usec = 0;
00048 if (setsockopt(fSocket, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timout, sizeof(timeval)) < 0) {
00049 jack_error("SetWriteTimeOut fd = %ld err = %s", fSocket, strerror(errno));
00050 }
00051 }
00052
00053 void JackClientSocket::SetNonBlocking(bool onoff)
00054 {
00055 int flag = (onoff) ? 1 : 0;
00056 if (ioctl(fSocket, FIONBIO, &flag) < 0) {
00057 jack_error("SetNonBlocking fd = %ld err = %s", fSocket, strerror(errno));
00058 }
00059 }
00060
00061 int JackClientSocket::Connect(const char* dir, const char* name, int which)
00062 {
00063 struct sockaddr_un addr;
00064
00065 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00066 jack_error("Cannot create socket err = %s", strerror(errno));
00067 return -1;
00068 }
00069
00070 addr.sun_family = AF_UNIX;
00071 snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d_%d", dir, name, JackTools::GetUID(), which);
00072 jack_log("Connect: addr.sun_path %s", addr.sun_path);
00073
00074 if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00075 jack_error("Cannot connect to server socket err = %s", strerror(errno));
00076 close(fSocket);
00077 return -1;
00078 }
00079
00080 #ifdef __APPLE__
00081 int on = 1 ;
00082 if (setsockopt(fSocket, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) {
00083 jack_log("setsockopt SO_NOSIGPIPE fd = %ld err = %s", fSocket, strerror(errno));
00084 }
00085 #endif
00086
00087 return 0;
00088 }
00089
00090 int JackClientSocket::Connect(const char* dir, int which)
00091 {
00092 struct sockaddr_un addr;
00093
00094 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00095 jack_error("Cannot create socket err = %s", strerror(errno));
00096 return -1;
00097 }
00098
00099 addr.sun_family = AF_UNIX;
00100 snprintf(addr.sun_path, sizeof(addr.sun_path) - 1, "%s/jack_%d_%d", dir, JackTools::GetUID(), which);
00101 jack_log("Connect: addr.sun_path %s", addr.sun_path);
00102
00103 if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00104 jack_error("Cannot connect to server socket err = %s", strerror(errno));
00105 close(fSocket);
00106 return -1;
00107 }
00108
00109 #ifdef __APPLE__
00110 int on = 1 ;
00111 if (setsockopt(fSocket, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&on, sizeof(on)) < 0) {
00112 jack_log("setsockopt SO_NOSIGPIPE fd = %ld err = %s", fSocket, strerror(errno));
00113 }
00114 #endif
00115
00116 return 0;
00117 }
00118
00119 int JackClientSocket::Close()
00120 {
00121 jack_log("JackClientSocket::Close");
00122 if (fSocket > 0) {
00123 shutdown(fSocket, SHUT_RDWR);
00124 close(fSocket);
00125 fSocket = -1;
00126 return 0;
00127 } else {
00128 return -1;
00129 }
00130 }
00131
00132 int JackClientSocket::Read(void* data, int len)
00133 {
00134 if (read(fSocket, data, len) != len) {
00135 jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
00136 if (errno == EWOULDBLOCK) {
00137 jack_error("JackClientSocket::Read time out");
00138 return 0;
00139 } else {
00140 return -1;
00141 }
00142 } else {
00143 return 0;
00144 }
00145 }
00146
00147 int JackClientSocket::Write(void* data, int len)
00148 {
00149 if (write(fSocket, data, len) != len) {
00150 jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
00151 if (errno == EWOULDBLOCK) {
00152 jack_log("JackClientSocket::Write time out");
00153 return 0;
00154 } else {
00155 return -1;
00156 }
00157 } else {
00158 return 0;
00159 }
00160 }
00161
00162 int JackServerSocket::Bind(const char* dir, const char* name, int which)
00163 {
00164 struct sockaddr_un addr;
00165
00166 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00167 jack_error("Cannot create server socket err = %s", strerror(errno));
00168 return -1;
00169 }
00170
00171 addr.sun_family = AF_UNIX;
00172
00173
00174 snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%s_%d_%d", dir, name, JackTools::GetUID(), which);
00175 strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1);
00176
00177
00178
00179
00180
00181
00182 jack_log("Bind: addr.sun_path %s", addr.sun_path);
00183 unlink(fName);
00184
00185 if (bind(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00186 jack_error("Cannot bind server to socket err = %s", strerror(errno));
00187 goto error;
00188 }
00189
00190 if (listen(fSocket, 1) < 0) {
00191 jack_error("Cannot enable listen on server socket err = %s", strerror(errno));
00192 goto error;
00193 }
00194
00195 return 0;
00196
00197 error:
00198 unlink(fName);
00199 close(fSocket);
00200 return -1;
00201 }
00202
00203 int JackServerSocket::Bind(const char* dir, int which)
00204 {
00205 struct sockaddr_un addr;
00206
00207 if ((fSocket = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
00208 jack_error("Cannot create server socket err = %s", strerror(errno));
00209 return -1;
00210 }
00211
00212 addr.sun_family = AF_UNIX;
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 snprintf(fName, sizeof(addr.sun_path) - 1, "%s/jack_%d_%d", dir, JackTools::GetUID(), which);
00226 strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1);
00227
00228
00229
00230
00231
00232
00233 jack_log("Bind: addr.sun_path %s", addr.sun_path);
00234 unlink(fName);
00235
00236 if (bind(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
00237 jack_error("Cannot bind server to socket err = %s", strerror(errno));
00238 goto error;
00239 }
00240
00241 if (listen(fSocket, 1) < 0) {
00242 jack_error("Cannot enable listen on server socket err = %s", strerror(errno));
00243 goto error;
00244 }
00245
00246 return 0;
00247
00248 error:
00249 unlink(fName);
00250 close(fSocket);
00251 return -1;
00252 }
00253
00254 JackClientSocket* JackServerSocket::Accept()
00255 {
00256 struct sockaddr_un client_addr;
00257 socklen_t client_addrlen;
00258
00259 memset(&client_addr, 0, sizeof(client_addr));
00260 client_addrlen = sizeof(client_addr);
00261
00262 int fd = accept(fSocket, (struct sockaddr*)&client_addr, &client_addrlen);
00263 if (fd < 0) {
00264 jack_error("Cannot accept new connection err = %s", strerror(errno));
00265 return 0;
00266 } else {
00267 return new JackClientSocket(fd);
00268 }
00269 }
00270
00271 int JackServerSocket::Close()
00272 {
00273 if (fSocket > 0) {
00274 jack_log("JackServerSocket::Close %s", fName);
00275 shutdown(fSocket, SHUT_RDWR);
00276 close(fSocket);
00277 unlink(fName);
00278 fSocket = -1;
00279 return 0;
00280 } else {
00281 return -1;
00282 }
00283 }
00284
00285 }
00286
00287