SF Tracker [ 1628629 ] Multicast interface patch
Submitted By: Fredrik Svensson - svefredrik This patch fixes two problems: * Specify the IP address for the interface when we do setsockopt IP_ADD_MEMBERSHIP. This makes it possible to run when no default router has been configured. * Explicitly set the multicast interface through setsockopt IP_MULTICAST_IF. Avoids socket error -207 in some cases. git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@119 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
parent
363ac6e007
commit
2331839f69
@ -922,6 +922,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
struct ip_mreq ssdpMcastAddr;
|
struct ip_mreq ssdpMcastAddr;
|
||||||
struct sockaddr_in ssdpAddr;
|
struct sockaddr_in ssdpAddr;
|
||||||
int option = 1;
|
int option = 1;
|
||||||
|
struct in_addr addr;
|
||||||
|
|
||||||
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
|
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
|
||||||
== UPNP_INVALID_SOCKET ) {
|
== UPNP_INVALID_SOCKET ) {
|
||||||
@ -997,7 +998,7 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
}
|
}
|
||||||
|
|
||||||
memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) );
|
memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) );
|
||||||
ssdpMcastAddr.imr_interface.s_addr = htonl( INADDR_ANY );
|
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
|
||||||
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
|
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
|
||||||
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
( char * )&ssdpMcastAddr,
|
( char * )&ssdpMcastAddr,
|
||||||
@ -1012,6 +1013,17 @@ get_ssdp_sockets( MiniServerSockArray * out )
|
|||||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||||
return UPNP_E_SOCKET_ERROR;
|
return UPNP_E_SOCKET_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set multicast interface. */
|
||||||
|
memset( ( void * )&addr, 0, sizeof( struct in_addr ));
|
||||||
|
addr.s_addr = inet_addr(LOCAL_HOST);
|
||||||
|
if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
|
||||||
|
(char *)&addr, sizeof addr) != 0) {
|
||||||
|
DBGONLY(UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||||
|
"Couldn't set multicast interface.\n" ));
|
||||||
|
/* This is probably not a critical error, so let's continue. */
|
||||||
|
}
|
||||||
|
|
||||||
// result is not checked becuase it will fail in WinMe and Win9x.
|
// result is not checked becuase it will fail in WinMe and Win9x.
|
||||||
setsockopt( ssdpSock, IPPROTO_IP,
|
setsockopt( ssdpSock, IPPROTO_IP,
|
||||||
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user