2#include "SockAddress.h"
3#include "TempFailure.h"
13void setBroadcast(
int socket)
18 ::setsockopt( socket, SOL_SOCKET, SO_BROADCAST, &value,
sizeof(value));
21int groupAction(
int socket,
const std::string& multicastGroup,
int action)
23 struct ip_mreq request;
24 request.imr_multiaddr.s_addr = inet_addr( multicastGroup.c_str());
25 request.imr_interface.s_addr = htonl(INADDR_ANY);
27 return ::setsockopt( socket, IPPROTO_IP, action, &request,
sizeof(request));
35 setBroadcast(m_socket);
38void UDPSocket::sendTo(
const void* buffer,
size_t len, std::string_view foreignAddress,
unsigned short foreignPort)
40 SockAddress addr( m_family, foreignAddress, foreignPort);
42 int sent = TEMP_FAILURE_RETRY (::sendto( m_socket, (
const raw_type*)buffer, len, 0, addr.data(), addr.length()));
53 int ret = TEMP_FAILURE_RETRY (::recvfrom( m_socket, (raw_type*)buffer, len, 0, addr.data(), addr.lengthPtr()));
57 sourceAddress = addr.address();
58 sourcePort = addr.port();
67 poll.events = POLLIN | POLLPRI | POLLRDHUP;
69 int ret = TEMP_FAILURE_RETRY (::poll( &poll, 1, timeout));
71 if( ret == 0)
return 0;
74 if( poll.revents & POLLRDHUP || poll.revents & POLLHUP)
75 m_peerDisconnected =
true;
77 if( poll.revents & POLLIN || poll.revents & POLLPRI)
78 return receiveFrom( buffer, len, sourceAddress, sourcePort);
80 if( poll.revents & (POLLERR | POLLNVAL))
88 const int value = multicastTTL;
89 if( ::setsockopt( m_socket, IPPROTO_IP, IP_MULTICAST_TTL, &value,
sizeof(value)) < 0)
96 if( inet_aton( address.c_str(), &iface) == 0)
99 if( ::setsockopt( m_socket, IPPROTO_IP, IP_MULTICAST_IF, &iface,
sizeof(iface)) < 0)
100 throw SocketException(
"Multicast set Interface Address failed (setsockopt)");
105 if( groupAction( m_socket, multicastGroup, IP_ADD_MEMBERSHIP) < 0)
111 if( groupAction( m_socket, multicastGroup, IP_DROP_MEMBERSHIP) < 0)
InternetSocket(int sockfd)
create socket from a SocketHandle returned by an accept() call
Signals a problem with the execution of a socket call.
int timedReceiveFrom(void *buffer, size_t len, std::string &sourceAddress, unsigned short &sourcePort, int timeout)
int receiveFrom(void *buffer, size_t len, std::string &sourceAddress, unsigned short &sourcePort)
void setMulticastTTL(unsigned char multicastTTL)
UDPSocket(AddressFamily family=IPv4)
void setMulticastInterfaceAddr(const std::string &address)
void joinGroup(const std::string &multicastGroup)
void sendTo(const void *buffer, size_t len, std::string_view foreignAddress, unsigned short foreignPort)
void leaveGroup(const std::string &multicastGroup)