41 #include <ucommon-config.h> 51 #define _IOLEN64 (unsigned) 52 #define _IORET64 (int) 53 typedef int socklen_t;
55 #define socket_errno WSAGetLastError() 57 #include <sys/ioctl.h> 58 #include <netinet/tcp.h> 60 #include <netinet/ip6.h> 62 #define socket_errno errno 64 # define O_NONBLOCK O_NDELAY 68 # define SOL_IP IPPROTO_IP 73 #ifndef INADDR_LOOPBACK 74 #define INADDR_LOOPBACK (in_addr_t)0x7f000001 77 #ifdef HAVE_NETINET_IN_H 78 #include <netinet/in.h> 82 #define _XOPEN_SOURCE_EXTENDED 99 #if defined(_MSWINDOWS_) && !defined(__MINGW32__) 105 HANDLE pidHandle = GetCurrentProcess();
107 if(DuplicateHandle(pidHandle, reinterpret_cast<HANDLE>(
so), pidHandle, &dupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS))
108 return reinterpret_cast<socket_t>(dupHandle);
111 # define DUP_SOCK(s,state) dupSocket(s,state) 121 flags.thrown =
false;
122 flags.broadcast =
false;
124 flags.keepalive =
false;
125 flags.loopback =
true;
126 flags.multicast =
false;
127 flags.linger =
false;
161 setsockopt(
so, SOL_SOCKET, SO_LINGER, (
char *)&
linger,
162 (socklen_t)
sizeof(
linger));
176 so = socket(domain,
type, protocol);
183 setsockopt(
so, SOL_SOCKET, SO_NOSIGPIPE, (
char *)&opt,
sizeof(opt));
227 #ifdef CCXX_EXCEPTIONS 245 const char*
str =
"Could not connect to remote host";
246 switch(WSAGetLastError()) {
251 case WSAEADDRNOTAVAIL:
253 case WSAECONNREFUSED:
264 char*
str = (
char *)
"Could not connect to remote host";
293 if(setsockopt(
so, SOL_SOCKET, SO_SNDLOWAT, (
char *)&
limit,
sizeof(
limit)))
306 if(setsockopt(
so, SOL_SOCKET, SO_RCVLOWAT, (
char *)&
limit,
sizeof(
limit)))
321 tv.tv_sec = to / 1000;
322 tv.tv_usec = (to % 1000) * 1000;
324 if(setsockopt(
so, SOL_SOCKET, SO_SNDTIMEO, (
char *)&tv,
sizeof(tv)))
339 tv.tv_sec = to / 1000;
340 tv.tv_usec = (to % 1000) * 1000;
342 if(setsockopt(
so, SOL_SOCKET, SO_RCVTIMEO, (
char *)&tv,
sizeof(tv)))
354 if(setsockopt(
so, SOL_SOCKET, SO_SNDBUF, (
char *)&bufsize,
sizeof(bufsize)))
374 if(setsockopt(
so, SOL_SOCKET, SO_RCVBUF, (
char *)&bufsize,
sizeof(bufsize)))
384 int opt = (enable ? 1 : 0);
385 if(setsockopt(
so, SOL_SOCKET, SO_BROADCAST,
386 (
char *)&opt, (socklen_t)
sizeof(opt)))
388 flags.broadcast = enable;
399 struct sockaddr_in6
addr;
402 if(enable ==
flags.multicast)
405 flags.multicast = enable;
407 getsockname(
so, (
struct sockaddr *)&
addr, &
len);
409 memset(&
addr.sin6_addr, 0,
sizeof(
addr.sin6_addr));
411 setsockopt(
so, IPPROTO_IPV6, IPV6_MULTICAST_IF, (
char *)&
addr.sin6_addr,
sizeof(
addr.sin6_addr));
415 #ifdef IP_MULTICAST_IF 416 struct sockaddr_in addr4;
419 if(enable ==
flags.multicast)
422 flags.multicast = enable;
424 getsockname(
so, (
struct sockaddr *)&addr4, &
len);
426 memset(&addr4.sin_addr, 0,
sizeof(addr4.sin_addr));
428 setsockopt(
so, IPPROTO_IP, IP_MULTICAST_IF, (
char *)&addr4.sin_addr,
sizeof(addr4.sin_addr));
445 setsockopt(
so, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (
char *)&
ttl,
sizeof(
ttl));
449 #ifdef IP_MULTICAST_TTL 451 setsockopt(
so, IPPROTO_IP, IP_MULTICAST_TTL, (
char *)&
ttl,
sizeof(
ttl));
470 flags.loopback = enable;
475 setsockopt(
so, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (
char *)&loop,
sizeof(loop));
479 #ifdef IP_MULTICAST_LOOP 480 setsockopt(
so, IPPROTO_IP, IP_MULTICAST_LOOP, (
char *)&loop,
sizeof(loop));
520 int opt = (enable ? 1 : 0);
523 if(setsockopt(
so, SOL_SOCKET, SO_DONTROUTE,
524 (
char *)&opt, (socklen_t)
sizeof(opt)))
527 flags.route = enable;
533 int opt = (enable ? 1 : 0);
535 if(setsockopt(
so, IPPROTO_TCP, TCP_NODELAY,
536 (
char *)&opt, (socklen_t)
sizeof(opt)))
547 size_t nleft = request - 1;
555 while(nleft && !nl) {
573 for(c=0; c < nstat; ++c) {
575 if (c > 0 &&
str[c-1] ==
'\r')
590 str[nstat - 1] =
'\n';
597 return (ssize_t)(request - nleft - 1);
602 if ((Separator == 0x0D) || (Separator == 0x0A))
610 if (Separator == 0) {
617 nstat =::recv (
so, (
char *)Target,
_IOLEN64 Size, 0);
631 char *
str = (
char *) Target;
633 memset (
str, 0, Size);
635 while (nleft && !found) {
648 for (c = 0; (c < nstat) && !found; ++c) {
649 if (
str[c] == Separator)
653 memset (
str, 0, nleft);
654 nstat =::recv (
so,
str, c, 0);
661 return (ssize_t)(Size - (ssize_t) nleft);
670 const char *Slide = (
const char *) Source;
697 #ifdef CCXX_EXCEPTIONS 699 return e.getSystemErrorString();
722 pfd.events = POLLOUT;
725 pfd.events = POLLERR | POLLHUP;
733 status = poll(&pfd, 1, -1);
735 status = poll(&pfd, 1,
timeout);
740 if(status == -1 && errno == EINTR)
747 if(pfd.revents & pfd.events)
752 struct timeval *tvp = &tv;
758 tv.tv_usec = (
timeout % 1000) * 1000;
766 FD_SET(sosave, &grp);
769 status = ::select((
int)
so + 1, &grp, NULL, NULL, tvp);
772 status = ::select((
int)
so + 1, NULL, &grp, NULL, tvp);
775 status = ::select((
int)
so + 1, NULL, NULL, &grp, tvp);
780 if(FD_ISSET(
so, &grp))
791 Socket::operator bool()
const 821 so = socket(fam, SOCK_DGRAM, IPPROTO_UDP);
825 so = socket(fam, SOCK_DGRAM, IPPROTO_UDP);
844 socklen_t
len =
sizeof(from);
848 if(rc < 1 && WSAGetLastError() != WSAEMSGSIZE) {
863 addr.insert((sockaddr *)&from);
870 sockaddr_in* from =
addr;
872 any.s_addr = INADDR_ANY;
881 *
port = ntohs(from->sin_port);
886 IPV6Host Socket::getIPV6Sender(in_port_t *
port)
const 889 sockaddr_in6* from =
addr;
893 return IPV6Host(in6addr_any);
897 *
port = ntohs(from->sin6_port);
898 return IPV6Host(from->sin6_addr);
905 struct sockaddr_in6
addr;
908 if(getsockname(
so, (
struct sockaddr *)&
addr, &
len)) {
918 const sockaddr_in* from =
getLocal();
920 any.s_addr = INADDR_ANY;
929 *
port = ntohs(from->sin_port);
934 IPV6Host Socket::getIPV6Local(in_port_t *
port)
const 936 const sockaddr_in6* from =
getLocal();
940 return IPV6Host(in6addr_any);
944 *
port = ntohs(from->sin6_port);
945 return IPV6Host(from->sin6_addr);
953 struct sockaddr_in6
addr;
956 if(getpeername(
so, (
struct sockaddr *)&
addr, &
len)) {
958 if(errno == ENOTCONN)
973 any.s_addr = INADDR_ANY;
982 *
port = ntohs(from->sin_port);
987 IPV6Host Socket::getIPV6Peer(in_port_t *
port)
const 989 sockaddr_in6* from =
getPeer();
993 return IPV6Host(in6addr_any);
997 *
port = ntohs(from->sin6_port);
998 return IPV6Host(from->sin6_addr);
1004 flags.completion = immediate;
1006 unsigned long flag = 0;
1008 switch( immediate ) {
1020 ioctlsocket(
so, FIONBIO, &flag);
1022 int fflags = fcntl(
so, F_GETFL);
1026 fcntl(
so, F_SETFL, fflags);
1030 fcntl(
so, F_SETFL, fflags);
1037 int opt = (enable ? ~0: 0);
1038 #if (defined(SO_KEEPALIVE) || defined(_MSWINDOWS_)) 1039 if(setsockopt(
so, SOL_SOCKET, SO_KEEPALIVE,
1040 (
char *)&opt, (socklen_t)
sizeof(opt)))
1043 flags.keepalive = enable;
1062 #ifdef IPTOS_LOWDELAY 1067 #ifdef IPTOS_THROUGHPUT 1072 #ifdef IPTOS_RELIABILITY 1077 #ifdef IPTOS_MINCOST 1085 if(setsockopt(
so, SOL_IP, IP_TOS,(
char *)&
tos, (socklen_t)
sizeof(
tos)))