20 #include "JackNetUnixSocket.h"
21 #include "JackError.h"
31 int GetHostName(
char * name,
int size)
33 if (gethostname(name, size) == SOCKET_ERROR) {
34 jack_error(
"Can't get 'hostname' : %s", strerror(NET_ERROR_CODE));
35 strcpy(name,
"default");
42 JackNetUnixSocket::JackNetUnixSocket()
47 fSendAddr.sin_family = AF_INET;
48 fSendAddr.sin_addr.s_addr = htonl(INADDR_ANY);
49 memset(&fSendAddr.sin_zero, 0, 8);
50 fRecvAddr.sin_family = AF_INET;
51 fRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
52 memset(&fRecvAddr.sin_zero, 0, 8);
55 JackNetUnixSocket::JackNetUnixSocket(
const char* ip,
int port)
60 fSendAddr.sin_family = AF_INET;
61 fSendAddr.sin_port = htons(port);
62 inet_aton(ip, &fSendAddr.sin_addr);
63 memset(&fSendAddr.sin_zero, 0, 8);
64 fRecvAddr.sin_family = AF_INET;
65 fRecvAddr.sin_port = htons(port);
66 fRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
67 memset(&fRecvAddr.sin_zero, 0, 8);
70 JackNetUnixSocket::JackNetUnixSocket(
const JackNetUnixSocket& socket)
75 fSendAddr = socket.fSendAddr;
76 fRecvAddr = socket.fRecvAddr;
79 JackNetUnixSocket::~JackNetUnixSocket()
84 JackNetUnixSocket& JackNetUnixSocket::operator=(
const JackNetUnixSocket& socket)
86 if (
this != &socket) {
89 fSendAddr = socket.fSendAddr;
90 fRecvAddr = socket.fRecvAddr;
96 int JackNetUnixSocket::NewSocket()
102 fSockfd = socket(AF_INET, SOCK_DGRAM, 0);
107 if ((res = setsockopt(fSockfd, SOL_SOCKET, SO_REUSEPORT, &on,
sizeof(on))) < 0) {
109 if ((res = setsockopt(fSockfd, SOL_SOCKET, SO_REUSEADDR, &on,
sizeof(on))) < 0) {
111 StrError(NET_ERROR_CODE);
128 socklen_t len =
sizeof(tos);
130 res = getsockopt(fSockfd, IPPROTO_IP, IP_TOS, &tos, &len);
133 res = setsockopt(fSockfd, IPPROTO_IP, IP_TOS, &tos,
sizeof(tos));
138 bool JackNetUnixSocket::IsLocal(
char* ip)
140 if (strcmp(ip,
"127.0.0.1") == 0) {
145 gethostname(host_name,
sizeof(host_name));
147 struct hostent* host = gethostbyname(host_name);
149 for (
int i = 0; host->h_addr_list[i] != 0; ++i) {
151 memcpy(&addr, host->h_addr_list[i],
sizeof(
struct in_addr));
152 if (strcmp(inet_ntoa(addr), ip) == 0) {
162 int JackNetUnixSocket::Bind()
164 return ::bind(fSockfd, reinterpret_cast<socket_address_t*>(&fRecvAddr),
sizeof(socket_address_t));
167 int JackNetUnixSocket::BindWith(
const char* ip)
169 int addr_conv = inet_aton(ip, &fRecvAddr.sin_addr);
176 int JackNetUnixSocket::BindWith(
int port)
178 fRecvAddr.sin_port = htons(port);
182 int JackNetUnixSocket::Connect()
184 return connect(fSockfd, reinterpret_cast<socket_address_t*>(&fSendAddr),
sizeof(socket_address_t));
187 int JackNetUnixSocket::ConnectTo(
const char* ip)
189 int addr_conv = inet_aton(ip, &fSendAddr.sin_addr);
196 void JackNetUnixSocket::Close()
204 void JackNetUnixSocket::Reset()
206 fSendAddr.sin_family = AF_INET;
207 fSendAddr.sin_port = htons(fPort);
208 fSendAddr.sin_addr.s_addr = htonl(INADDR_ANY);
209 memset(&fSendAddr.sin_zero, 0, 8);
210 fRecvAddr.sin_family = AF_INET;
211 fRecvAddr.sin_port = htons(fPort);
212 fRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
213 memset(&fRecvAddr.sin_zero, 0, 8);
216 bool JackNetUnixSocket::IsSocket()
218 return(fSockfd) ?
true :
false;
222 void JackNetUnixSocket::SetPort(
int port)
225 fSendAddr.sin_port = htons(port);
226 fRecvAddr.sin_port = htons(port);
229 int JackNetUnixSocket::GetPort()
235 int JackNetUnixSocket::SetAddress(
const char* ip,
int port)
237 int addr_conv = inet_aton(ip, &fSendAddr.sin_addr);
241 fSendAddr.sin_port = htons(port);
245 char* JackNetUnixSocket::GetSendIP()
247 return inet_ntoa(fSendAddr.sin_addr);
250 char* JackNetUnixSocket::GetRecvIP()
252 return inet_ntoa(fRecvAddr.sin_addr);
256 int JackNetUnixSocket::GetName(
char* name)
258 return gethostname(name, 255);
261 int JackNetUnixSocket::JoinMCastGroup(
const char* ip)
263 struct ip_mreq multicast_req;
264 inet_aton(ip, &multicast_req.imr_multiaddr);
265 multicast_req.imr_interface.s_addr = htonl(INADDR_ANY);
266 return SetOption(IPPROTO_IP, IP_ADD_MEMBERSHIP, &multicast_req,
sizeof(multicast_req));
270 int JackNetUnixSocket::SetOption(
int level,
int optname,
const void* optval, socklen_t optlen)
272 return setsockopt(fSockfd, level, optname, optval, optlen);
275 int JackNetUnixSocket::GetOption(
int level,
int optname,
void* optval, socklen_t* optlen)
277 return getsockopt(fSockfd, level, optname, optval, optlen);
282 #if defined(__sun__) || defined(sun)
283 int JackNetUnixSocket::SetTimeOut(
int us)
288 if ((flags = fcntl(fSockfd, F_GETFL, 0)) < 0) {
289 jack_error(
"JackNetUnixSocket::SetTimeOut error in fcntl F_GETFL");
294 if (fcntl(fSockfd, F_SETFL, flags) < 0) {
295 jack_error(
"JackNetUnixSocket::SetTimeOut error in fcntl F_SETFL");
302 int JackNetUnixSocket::WaitRead()
310 tv.tv_sec = fTimeOut / 1000000;
311 tv.tv_usec = fTimeOut % 1000000;
314 FD_SET(fSockfd, &fdset);
317 res = select(fSockfd + 1, &fdset, NULL, NULL, &tv);
318 }
while (res < 0 && errno == EINTR);
322 }
else if (res == 0) {
331 int JackNetUnixSocket::WaitWrite()
339 tv.tv_sec = fTimeOut / 1000000;
340 tv.tv_usec = fTimeOut % 1000000;
343 FD_SET(fSockfd, &fdset);
346 res = select(fSockfd + 1, NULL, &fdset, NULL, &tv);
347 }
while (res < 0 && errno == EINTR);
351 }
else if (res == 0) {
361 int JackNetUnixSocket::SetTimeOut(
int us)
363 jack_log(
"JackNetUnixSocket::SetTimeout %d usecs", us);
364 struct timeval timeout;
369 timeout.tv_usec = us;
372 float sec = float(us) / 1000000.f;
373 timeout.tv_sec = (int)sec;
374 float usec = (sec - float(timeout.tv_sec)) * 1000000;
375 timeout.tv_usec =(int)usec;
377 return SetOption(SOL_SOCKET, SO_RCVTIMEO, &timeout,
sizeof(timeout));
382 int JackNetUnixSocket::SetLocalLoop()
385 return SetOption(IPPROTO_IP, IP_MULTICAST_LOOP, &disable,
sizeof(disable));
389 int JackNetUnixSocket::SendTo(
const void* buffer,
size_t nbytes,
int flags)
391 #if defined(__sun__) || defined(sun)
392 if (WaitWrite() < 0) {
397 if ((res = sendto(fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*>(&fSendAddr),
sizeof(socket_address_t))) < 0) {
398 jack_error(
"SendTo fd = %ld err = %s", fSockfd, strerror(errno));
403 int JackNetUnixSocket::SendTo(
const void* buffer,
size_t nbytes,
int flags,
const char* ip)
405 int addr_conv = inet_aton(ip, &fSendAddr.sin_addr);
409 fSendAddr.sin_port = htons(fPort);
410 #if defined(__sun__) || defined(sun)
411 if (WaitWrite() < 0) {
415 return SendTo(buffer, nbytes, flags);
418 int JackNetUnixSocket::Send(
const void* buffer,
size_t nbytes,
int flags)
420 #if defined(__sun__) || defined(sun)
421 if (WaitWrite() < 0) {
426 if ((res = send(fSockfd, buffer, nbytes, flags)) < 0) {
427 jack_error(
"Send fd = %ld err = %s", fSockfd, strerror(errno));
432 int JackNetUnixSocket::RecvFrom(
void* buffer,
size_t nbytes,
int flags)
434 socklen_t addr_len =
sizeof(socket_address_t);
435 #if defined(__sun__) || defined(sun)
436 if (WaitRead() < 0) {
441 if ((res = recvfrom(fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*>(&fRecvAddr), &addr_len)) < 0) {
442 jack_error(
"RecvFrom fd = %ld err = %s", fSockfd, strerror(errno));
447 int JackNetUnixSocket::Recv(
void* buffer,
size_t nbytes,
int flags)
449 #if defined(__sun__) || defined(sun)
450 if (WaitRead() < 0) {
455 if ((res = recv(fSockfd, buffer, nbytes, flags)) < 0) {
456 jack_error(
"Recv fd = %ld err = %s", fSockfd, strerror(errno));
461 int JackNetUnixSocket::CatchHost(
void* buffer,
size_t nbytes,
int flags)
463 socklen_t addr_len =
sizeof(socket_address_t);
464 #if defined(__sun__) || defined(sun)
465 if (WaitRead() < 0) {
470 if ((res = recvfrom(fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*>(&fSendAddr), &addr_len)) < 0) {
471 jack_log(
"CatchHost fd = %ld err = %s", fSockfd, strerror(errno));
476 net_error_t JackNetUnixSocket::GetError()
491 return NET_CONN_ERROR;
495 return NET_CONN_ERROR;
499 void JackNetUnixSocket::PrintError()
510 jack_error(
"JackNetUnixSocket : ECONNABORTED");
513 jack_error(
"JackNetUnixSocket : ECONNREFUSED");
525 jack_error(
"JackNetUnixSocket : EHOSTUNREACH");
531 jack_error(
"JackNetUnixSocket : ENETUNREACH");
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)