40 #include <ucommon-config.h> 49 #define _IOLEN64 (unsigned) 50 #define _IORET64 (int) 51 typedef int socklen_t;
53 #define socket_errno WSAGetLastError() 55 #include <sys/ioctl.h> 56 #include <netinet/tcp.h> 58 #include <netinet/ip6.h> 60 #define socket_errno errno 62 # define O_NONBLOCK O_NDELAY 66 # define SOL_IP IPPROTO_IP 71 #ifndef INADDR_LOOPBACK 72 #define INADDR_LOOPBACK (unsigned long)0x7f000001 75 #ifdef HAVE_NETINET_IN_H 76 #include <netinet/in.h> 80 #define _XOPEN_SOURCE_EXTENDED 97 #ifdef HAVE_GETADDRINFO 100 Socket(fam, SOCK_DGRAM, IPPROTO_UDP)
102 char namebuf[128], *cp;
103 struct addrinfo hint, *list = NULL, *first;
108 snprintf(namebuf,
sizeof(namebuf),
"%s", name);
109 cp = strrchr(namebuf,
'/');
110 if(!cp && family == IPV4)
111 cp = strrchr(namebuf,
':');
120 if(!strcmp(name,
"*"))
124 memset(&hint, 0,
sizeof(hint));
132 error(errBindingFailed, (
char *)
"Could not find service", errno);
137 #if defined(SO_REUSEADDR) 139 setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (
char *)&opt,
140 (socklen_t)
sizeof(opt));
156 error(errBindingFailed, (
char *)
"Count not bind socket", errno);
164 Socket(fam, SOCK_DGRAM, IPPROTO_UDP)
166 char namebuf[128], *cp;
170 snprintf(namebuf,
sizeof(namebuf),
"%s", name);
171 cp = strrchr(namebuf,
'/');
173 cp = strrchr(namebuf,
':');
186 #if defined(SO_REUSEADDR) 188 setsockopt(
so, SOL_SOCKET, SO_REUSEADDR, (
char *)&opt,
189 (socklen_t)
sizeof(opt));
205 Socket(fam, SOCK_DGRAM, IPPROTO_UDP)
212 Socket(ia.family(), SOCK_DGRAM, IPPROTO_UDP)
216 #if defined(SO_REUSEADDR) 218 setsockopt(
so, SOL_SOCKET, SO_REUSEADDR, (
char *)&opt, (socklen_t)
sizeof(opt));
220 if(bind(
so,
peer, (socklen_t)
peer.getLength())) {
229 Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP), peer(ia.getAddress(),
port), family(IPV4)
231 #if defined(SO_REUSEADDR) 233 setsockopt(
so, SOL_SOCKET, SO_REUSEADDR, (
char *)&opt, (socklen_t)
sizeof(opt));
235 if(bind(
so,
peer,
sizeof(sockaddr_in))) {
245 Socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP), peer(ia.getAddress(),
port), family(IPV6)
247 #if defined(SO_REUSEADDR) 249 setsockopt(
so, SOL_SOCKET, SO_REUSEADDR, (
char *)&opt, (socklen_t)
sizeof(opt));
251 if(bind(
so,
peer,
sizeof(sockaddr_in6))) {
268 socklen_t alen = (socklen_t)
peer.getLength();
280 socklen_t alen = (socklen_t)
peer.getLength();
281 struct sockaddr_in6 senderAddress;
288 addr = (
struct sockaddr*)(&senderAddress);
289 alen =
sizeof(
struct sockaddr_in6);
296 if (bytes == SOCKET_ERROR) {
320 #if defined(IP_ADD_MEMBERSHIP) && defined(SIOCGIFINDEX) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) && !defined(_OSF_SOURCE) && !defined(__hpux) && !defined(__GNU__) && !defined(__NetBSD__) 322 struct ip_mreqn mreqn;
323 struct ifreq m_ifreq;
325 sockaddr_in* in4 = (sockaddr_in*)
peer.get(AF_INET);
328 memset(&mreqn, 0,
sizeof(mreqn));
329 memcpy(&mreqn.imr_multiaddr.s_addr, &in4->sin_addr,
sizeof(mreqn.imr_multiaddr.s_addr));
331 for (i = 0; i < IFNAMSIZ && DeviceName[i]; ++i)
332 m_ifreq.ifr_name[i] = DeviceName[i];
333 for (; i < IFNAMSIZ; ++i)
334 m_ifreq.ifr_name[i] = 0;
336 if (ioctl (
so, SIOCGIFINDEX, &m_ifreq))
339 #if defined(__FreeBSD__) || defined(__GNU__) 340 InterfaceIndex = m_ifreq.ifr_ifru.ifru_index;
342 InterfaceIndex = m_ifreq.ifr_ifindex;
356 struct sockaddr_in
addr;
368 addr.sin_family = AF_INET;
369 memset(&
addr.sin_addr, 0,
sizeof(
addr.sin_addr));
412 if(!::
connect(
so, (
struct sockaddr *)
peer.get(AF_INET),
sizeof(
struct sockaddr_in)))
429 if(!::
connect(
so, (
struct sockaddr *)
peer.get(AF_INET6),
sizeof(
struct sockaddr_in6)))
467 if (
addr.is_valid()) {
480 IPV6Host UDPSocket::getIPV6Peer(in_port_t *
port)
483 if (
addr.is_valid()) {
492 return IPV6Host(ucommon::Socket::address::ipv6(
addr)->sin6_addr);