20 #define AF_INET6_IS_AVAILABLE
34 int WSAAPI
getaddrinfo(
const char*,
const char*,
const struct addrinfo*,
struct addrinfo**);
35 int WSAAPI
getnameinfo(
const struct sockaddr*,socklen_t,
char*,DWORD,
char*,DWORD,
int);
41 #define MSG_NOSIGNAL 0
44 #include <sys/socket.h>
45 #include <netinet/in.h>
46 #include <arpa/inet.h>
52 #define MSG_NOSIGNAL 0
56 #define MSG_NOSIGNAL 0
71 WORD wVersionRequested;
78 wVersionRequested = MAKEWORD(1,1);
80 wVersionRequested = MAKEWORD(2,0);
82 err = WSAStartup(wVersionRequested, &wsadata);
85 ::printf(
"Startup error=%d on windows\n",err);
135 if(a == NULL)
return;
136 if((strlen(a)+1) >
sizeof(
adr))
return;
160 if(
s == -1)
return -1;
161 if(
select(timeout) == 0)
return 0;
167 ret = recv(
s,&cbuf[i],len-i,0);
176 if(
select(timeout) == 0)
return 0;
187 if(
s == -1)
return -1;
188 if(
select(timeout) == 0)
return 0;
196 ret = recv(
s,&buf[i],1,0);
200 if(WSAEWOULDBLOCK == WSAGetLastError())
goto tryagain;
222 int ret,bytes_left,first_byte;
225 if(
s == -1)
return -1;
230 while(bytes_left > 0)
250 size_t socklen =
sizeof(
struct sockaddr);
252 socklen_t socklen =
sizeof(
struct sockaddr);
254 struct sockaddr_in localAddr;
255 struct sockaddr_in remoteAddr;
256 struct hostent *host;
257 struct in_addr RemoteIpAddress;
258 #ifdef AF_INET6_IS_AVAILABLE
259 struct addrinfo hints0, hints1;
260 struct addrinfo *res, *ressave;
275 os = socket(AF_INET,SOCK_STREAM,0);
280 if(setsockopt(
os,SOL_SOCKET,SO_KEEPALIVE,&option,
sizeof(option)) < 0)
287 setsockopt(
os,SOL_SOCKET,SO_REUSEADDR,(
const char *) &option,
sizeof(option));
289 setsockopt(
os,SOL_SOCKET,SO_REUSEADDR,&option,
sizeof(option));
292 memset(&localAddr,0,
sizeof(localAddr));
293 localAddr.sin_port = htons((
short)
port);
294 localAddr.sin_family = AF_INET;
296 ret = bind(
os, (
struct sockaddr *) &localAddr,
sizeof(localAddr));
315 #ifdef AF_INET6_IS_AVAILABLE
318 memset(&hints0,0,
sizeof(hints0));
319 hints0.ai_flags = AI_PASSIVE;
321 hints0.ai_family = AF_INET6;
322 hints0.ai_socktype = SOCK_STREAM;
323 sprintf(portstr,
"%d",
port);
329 ::printf(
"rlSocket:tcp_listen error for %s port=%s : %s\n",
adr, portstr, gai_strerror(n));
338 os = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
342 if(setsockopt(
os,SOL_SOCKET,SO_KEEPALIVE,&option,
sizeof(option)) < 0)
349 setsockopt(
os,SOL_SOCKET,SO_REUSEADDR,(
const char *) &option,
sizeof(option));
351 setsockopt(
os,SOL_SOCKET,SO_REUSEADDR,&option,
sizeof(option));
353 if(bind(
os, res->ai_addr, res->ai_addrlen) == 0)
break;
357 while((res = res->ai_next) != NULL);
375 ::printf(
"rlSocket:ERROR IPV6 not available on this platform\n");
390 os = socket(AF_INET,SOCK_STREAM,0);
396 host = gethostbyname(
adr);
400 RemoteIpAddress.s_addr = inet_addr(
adr);
401 if(RemoteIpAddress.s_addr == INADDR_NONE)
409 memcpy(&RemoteIpAddress,host->h_addr,host->h_length);
412 memset(&remoteAddr,0,
sizeof(remoteAddr));
413 remoteAddr.sin_family = AF_INET;
414 remoteAddr.sin_port = htons((
short)
port);
415 remoteAddr.sin_addr = RemoteIpAddress;
428 #ifdef AF_INET6_IS_AVAILABLE
429 sprintf(portstr,
"%d",
port);
430 memset(&hints1, 0,
sizeof(hints1));
431 hints1.ai_family = AF_UNSPEC;
432 hints1.ai_socktype = SOCK_STREAM;
437 ::printf(
"rlSocket:tcp_connect error for %s port=%s : %s\n",
adr, portstr, gai_strerror(n));
444 s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
446 if(::
connect(
s, res->ai_addr, res->ai_addrlen) == 0)
break;
449 while((res = res->ai_next) != NULL);
450 if(res == NULL)
::printf(
"rlSocket:tcp_connect error for %s port=%s\n",
adr, portstr);
453 ::printf(
"rlSocket:ERROR IPV6 not available on this platform\n");
480 if(
s == -1)
return 0;
486 struct timeval timout;
487 fd_set wset,rset,eset;
490 if(timeout == 0)
return 1;
497 timout.tv_sec = timeout / 1000;
498 timout.tv_usec = (timeout % 1000) * 1000;
500 ret =
::select(maxfdp1,&rset,&wset,&eset,&timout);
501 if(ret == 0)
return 0;
514 if(ret < 0)
return ret;
515 return write(message,strlen(message));
520 return printf(
"QPushButton(%d)\n",
id);
538 return getsockopt(sockfd, level, optname, (
char *) optval, optlen);
540 size_t len = *optlen;
541 int ret = getsockopt(sockfd, level, optname, optval, &len);
545 socklen_t len = *optlen;
546 int ret = getsockopt(sockfd, level, optname, optval, &len);
555 return setsockopt(sockfd, level, optname, (
const char *) optval, optlen);
557 return setsockopt(sockfd, level, optname, optval, optlen);
564 int len =
sizeof(option);