diff options
author | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2016-07-17 19:13:35 +0200 |
---|---|---|
committer | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2016-07-17 19:13:35 +0200 |
commit | 2b13fb969c6a05815c34295afeaffee4d60dc7fd (patch) | |
tree | b73aca948508ef4ea7a2042d4c81571b198f5aa3 /mcastseed/src/msock.c | |
parent | 3f0a442799955f56b2c77aabd6bc7aa4458718b4 (diff) | |
download | eficast-2b13fb969c6a05815c34295afeaffee4d60dc7fd.tar.gz eficast-2b13fb969c6a05815c34295afeaffee4d60dc7fd.tar.bz2 eficast-2b13fb969c6a05815c34295afeaffee4d60dc7fd.zip |
Drop msock.h and socket portability.
mcastseed/leech aren't really portable nor useful on M$ Windows™.
Diffstat (limited to 'mcastseed/src/msock.c')
-rw-r--r-- | mcastseed/src/msock.c | 372 |
1 files changed, 0 insertions, 372 deletions
diff --git a/mcastseed/src/msock.c b/mcastseed/src/msock.c deleted file mode 100644 index 191611d..0000000 --- a/mcastseed/src/msock.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - msock.c - multicast socket creation routines - - (C) 2016 Christian Beier <dontmind@sdf.org> - -*/ - -#ifndef __MINGW32__ -#include <unistd.h> -#endif -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> - -#include "msock.h" - -SOCKET mcast_send_socket(char* multicastIP, char* multicastPort, int multicastTTL, struct addrinfo **multicastAddr) { - - SOCKET sock; - struct addrinfo hints = { 0 }; /* Hints for name lookup */ - int status; - - -#ifdef WIN32 - WSADATA trash; - if(WSAStartup(MAKEWORD(2,0),&trash)!=0) - DieWithError("Couldn't init Windows Sockets\n"); -#endif - - - /* - Resolve destination address for multicast datagrams - */ - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_NUMERICHOST; - if ((status = getaddrinfo(multicastIP, multicastPort, &hints, multicastAddr)) != 0 ) - { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); - return -1; - } - - - - /* - Create socket for sending multicast datagrams - */ - if ( (sock = socket((*multicastAddr)->ai_family, (*multicastAddr)->ai_socktype, 0)) < 0 ) { - perror("socket() failed"); - freeaddrinfo(*multicastAddr); - return -1; - } - - /* - Set TTL of multicast packet - */ - if ( setsockopt(sock, - (*multicastAddr)->ai_family == PF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, - (*multicastAddr)->ai_family == PF_INET6 ? IPV6_MULTICAST_HOPS : IP_MULTICAST_TTL, - (char*) &multicastTTL, sizeof(multicastTTL)) != 0 ) { - perror("setsockopt() failed"); - freeaddrinfo(*multicastAddr); - return -1; - } - - - /* - set the sending interface - */ - if((*multicastAddr)->ai_family == PF_INET) { - in_addr_t iface = INADDR_ANY; /* well, yeah, any */ - if(setsockopt (sock, - IPPROTO_IP, - IP_MULTICAST_IF, - (char*)&iface, sizeof(iface)) != 0) { - perror("interface setsockopt() sending interface"); - freeaddrinfo(*multicastAddr); - return -1; - } - - } - if((*multicastAddr)->ai_family == PF_INET6) { - unsigned int ifindex = 0; /* 0 means 'default interface'*/ - if(setsockopt (sock, - IPPROTO_IPV6, - IPV6_MULTICAST_IF, - (char*)&ifindex, sizeof(ifindex)) != 0) { - perror("interface setsockopt() sending interface"); - freeaddrinfo(*multicastAddr); - return -1; - } - - } - - - return sock; - -} - - - -SOCKET mcast_recv_socket(char* multicastIP, char* multicastPort, int multicastRecvBufSize) { - - SOCKET sock; - struct addrinfo hints = { 0 }; /* Hints for name lookup */ - struct addrinfo* localAddr = 0; /* Local address to bind to */ - struct addrinfo* multicastAddr = 0; /* Multicast Address */ - int yes=1; - int status, optval; - socklen_t optval_len; - int dfltrcvbuf; - -#ifdef WIN32 - WSADATA trash; - if(WSAStartup(MAKEWORD(2,0),&trash)!=0) - DieWithError("Couldn't init Windows Sockets\n"); -#endif - - - /* Resolve the multicast group address */ - hints.ai_family = PF_UNSPEC; - hints.ai_flags = AI_NUMERICHOST; - if ((status = getaddrinfo(multicastIP, NULL, &hints, &multicastAddr)) != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); - goto error; - } - - - /* - Get a local address with the same family (IPv4 or IPv6) as our multicast group - This is for receiving on a certain port. - */ - hints.ai_family = multicastAddr->ai_family; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_flags = AI_PASSIVE; /* Return an address we can bind to */ - if ( getaddrinfo(NULL, multicastPort, &hints, &localAddr) != 0 ) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); - goto error; - } - - - /* Create socket for receiving datagrams */ - if ( (sock = socket(localAddr->ai_family, localAddr->ai_socktype, 0)) < 0 ) { - perror("socket() failed"); - goto error; - } - - - - /* - * Enable SO_REUSEADDR to allow multiple instances of this - * application to receive copies of the multicast datagrams. - */ - if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(int)) == -1) { - perror("setsockopt"); - goto error; - } - - /* Bind the local address to the multicast port */ - if ( bind(sock, localAddr->ai_addr, localAddr->ai_addrlen) != 0 ) { - perror("bind() failed"); - goto error; - } - - /* get/set socket receive buffer */ - optval=0; - optval_len = sizeof(optval); - if(getsockopt(sock, SOL_SOCKET, SO_RCVBUF,(char*)&optval, &optval_len) !=0) { - perror("getsockopt"); - goto error; - } - dfltrcvbuf = optval; - optval = multicastRecvBufSize; - if(setsockopt(sock,SOL_SOCKET,SO_RCVBUF,(char*)&optval,sizeof(optval)) != 0) { - perror("setsockopt"); - goto error; - } - if(getsockopt(sock, SOL_SOCKET, SO_RCVBUF,(char*)&optval, &optval_len) != 0) { - perror("getsockopt"); - goto error; - } - fprintf(stderr, "tried to set socket receive buffer from %d to %d, got %d\n", - dfltrcvbuf, multicastRecvBufSize, optval); - - - - - /* Join the multicast group. We do this seperately depending on whether we - * are using IPv4 or IPv6. - */ - if ( multicastAddr->ai_family == PF_INET && - multicastAddr->ai_addrlen == sizeof(struct sockaddr_in) ) /* IPv4 */ - { - struct ip_mreq multicastRequest; /* Multicast address join structure */ - - /* Specify the multicast group */ - memcpy(&multicastRequest.imr_multiaddr, - &((struct sockaddr_in*)(multicastAddr->ai_addr))->sin_addr, - sizeof(multicastRequest.imr_multiaddr)); - - /* Accept multicast from any interface */ - multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); - - /* Join the multicast address */ - if ( setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0 ) { - perror("setsockopt() failed"); - goto error; - } - } - else if ( multicastAddr->ai_family == PF_INET6 && - multicastAddr->ai_addrlen == sizeof(struct sockaddr_in6) ) /* IPv6 */ - { - struct ipv6_mreq multicastRequest; /* Multicast address join structure */ - - /* Specify the multicast group */ - memcpy(&multicastRequest.ipv6mr_multiaddr, - &((struct sockaddr_in6*)(multicastAddr->ai_addr))->sin6_addr, - sizeof(multicastRequest.ipv6mr_multiaddr)); - - /* Accept multicast from any interface */ - multicastRequest.ipv6mr_interface = 0; - - /* Join the multicast address */ - if ( setsockopt(sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char*) &multicastRequest, sizeof(multicastRequest)) != 0 ) { - perror("setsockopt() failed"); - goto error; - } - } - else { - perror("Neither IPv4 or IPv6"); - goto error; - } - - - - if(localAddr) - freeaddrinfo(localAddr); - if(multicastAddr) - freeaddrinfo(multicastAddr); - - return sock; - - error: - if(localAddr) - freeaddrinfo(localAddr); - if(multicastAddr) - freeaddrinfo(multicastAddr); - - return -1; -} - -SOCKET ucast_client_socket(char* serverIP, char* serverPort) { - - SOCKET sock; - struct addrinfo *serverAddr; - struct addrinfo hints = { 0 }; /* Hints for name lookup */ - int status; - - -#ifdef WIN32 - WSADATA trash; - if(WSAStartup(MAKEWORD(2,0),&trash)!=0) - DieWithError("Couldn't init Windows Sockets\n"); -#endif - - - /* - Resolve destination address - */ - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_NUMERICHOST; - if ((status = getaddrinfo(serverIP, serverPort, &hints, &serverAddr)) != 0 ) - { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); - return -1; - } - - /* - Create socket - */ - if ( (sock = socket(serverAddr->ai_family, serverAddr->ai_socktype, 0)) < 0 ) { - perror("socket() failed"); - freeaddrinfo(serverAddr); - return -1; - } - - /* - Connect it to the remote server - */ - if ( connect(sock, serverAddr->ai_addr, serverAddr->ai_addrlen) < 0 ) { - perror("connect() failed"); - close(sock); - freeaddrinfo(serverAddr); - return -1; - } - - freeaddrinfo(serverAddr); - return sock; -} - -SOCKET ucast_server_socket(char* serverPort, int maxPendingConnections) { - - SOCKET sock; - struct addrinfo *serverAddr; - struct addrinfo hints = { 0 }; /* Hints for name lookup */ - int status; - - -#ifdef WIN32 - WSADATA trash; - if(WSAStartup(MAKEWORD(2,0),&trash)!=0) - DieWithError("Couldn't init Windows Sockets\n"); -#endif - - - /* - Prepare an addrinfo struct for a local socket - */ - hints.ai_family = PF_INET6; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE; - if ((status = getaddrinfo(NULL, serverPort, &hints, &serverAddr)) != 0 ) - { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); - return -1; - } - /* - Create socket - */ - if ( (sock = socket(serverAddr->ai_family, serverAddr->ai_socktype, serverAddr->ai_protocol)) < 0 ) { - perror("socket() failed"); - freeaddrinfo(serverAddr); - return -1; - } - - /* - Accepts also IPv4 traffic if the socket is INET6 - */ - if(serverAddr->ai_family == PF_INET6) { - unsigned int no = 0; - if(setsockopt (sock, - IPPROTO_IPV6, - IPV6_V6ONLY, - (char*)&no, sizeof(no)) != 0) { - perror("setsockopt() !IPV6_V6ONLY failed"); - freeaddrinfo(serverAddr); - return -1; - } - } - - /* - Bind socket to local address/port - */ - if ( bind(sock, serverAddr->ai_addr, serverAddr->ai_addrlen) < 0 ) { - perror("bind() failed"); - close(sock); - freeaddrinfo(serverAddr); - return -1; - } - - freeaddrinfo(serverAddr); - /* - Start listening incoming connections - */ - if ( listen(sock, maxPendingConnections) < 0 ) { - perror("listen() failed"); - close(sock); - } - - return sock; -} |