[Sumover-dev] [svn commit] r4595 - vic/branches/mpeg4/net
sumover-dev at cs.ucl.ac.uk
sumover-dev at cs.ucl.ac.uk
Fri Feb 5 17:25:33 GMT 2010
Author: piers
Date: Fri Feb 5 17:25:33 2010
New Revision: 4595
Modified:
vic/branches/mpeg4/net/net-ip.cpp
Log:
Attempted to fix problem when there's a dodgy localhost name in DNS and the multicast fails to bind to it - it now fails over to IN_ANY_ADDR with a warning.
Also tidied up find_interfaces call for windows setup - should be tested under windows too.
Modified: vic/branches/mpeg4/net/net-ip.cpp
==============================================================================
--- vic/branches/mpeg4/net/net-ip.cpp (original)
+++ vic/branches/mpeg4/net/net-ip.cpp Fri Feb 5 17:25:33 2010
@@ -96,7 +96,7 @@
class IPNetwork : public Network {
public:
- IPNetwork() : Network(*(new IPAddress), *(new IPAddress), *(new IPAddress)) {;}
+ IPNetwork() : Network(*(new IPAddress), *(new IPAddress), *(new IPAddress)), local_preset(0) {;}
virtual int command(int argc, const char*const* argv);
virtual void reset();
virtual Address* alloc(const char* name) {
@@ -116,6 +116,7 @@
int open(const char * host, int port, int ttl);
int close();
int localname(sockaddr_in*);
+ int local_preset; // Indicates if local_ has been set on cmd line
int openssock(Address & addr, u_short port, int ttl);
int openrsock(Address & g_addr, Address & s_addr_ssm, u_short port, Address & local);
void dosend(u_char* buf, int len, int fd);
@@ -206,8 +207,10 @@
if (strcmp(argv[1], "open") == 0) {
int port = htons(atoi(argv[3]));
int ttl = atoi(argv[4]);
- if (strlen(tcl.attr("ifAddr"))>1)
+ if (strlen(tcl.attr("ifAddr"))>1) {
(IPAddress&)local_ = tcl.attr("ifAddr");
+ local_preset=1;
+ }
if (open(argv[2], port, ttl) < 0)
tcl.result("0");
else
@@ -250,19 +253,16 @@
*/
sockaddr_in local;
if (localname(&local) < 0) {
- //return (-1);
- (IPAddress&)local_ = "127.0.0.1";
- printf("Can NOT determine local IP address - using loopback address. If you want to be able to receive packets from other machines add this command line option: -i local_ip_addr \n");
- } else
- (IPAddress&)local_ = local.sin_addr;
-
#ifdef WIN32
- //if (!local_.is_set()) {
(IPAddress&)local_ = find_win32_interface(g_addr_, ttl);
- //(IPAddress&)local_ = "127.0.0.1";
debug_msg("find_win32_interface localname:%s\n",(const char*)local_);
- //}
#endif
+ if (local.sin_addr.s_addr == 0) {
+ (IPAddress&)local_ = "127.0.0.1";
+ printf("Can NOT determine local IP address - using loopback address. If you want to be able to receive packets from other machines add this command line option: -i local_ip_addr \n");
+ }
+ } else
+ (IPAddress&)local_ = local.sin_addr;
rsock_ = openrsock(g_addr_, s_addr_ssm_, port, local_);
if (rsock_ < 0) {
@@ -295,7 +295,7 @@
#endif
// Use Local interface name if already set via command line
- if (local_.is_set()) {
+ if (local_preset) {
p->sin_addr.s_addr=(IPAddress&)local_;
debug_msg("Setting localname from cmd line:%s\n",(const char*)local_);
return (0);
@@ -307,7 +307,7 @@
p->sin_addr.s_addr = 0;
p->sin_port = 0;
} else
- debug_msg("getsockname succeeded sin_addr.s_addr:%x\n",p->sin_addr.s_addr);
+ debug_msg("getsockname succeeded sin_addr.s_addr:%x\n",p->sin_addr.s_addr);
if (p->sin_addr.s_addr == 0) {
debug_msg("getsockname returned 0 so resorting to gethostname()\n");
@@ -422,11 +422,18 @@
mr.imr_multiaddr.s_addr = g_addri;
mr.imr_interface.s_addr = locali;
- if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+ if (setsockopt(fd, IPPROTO_IP,IP_ADD_MEMBERSHIP,
(char *)&mr, sizeof(mr)) < 0) {
- perror("IP_ADD_MEMBERSHIP");
- exit(1);
- }
+ perror("IP_ADD_MEMBERSHIP");
+ debug_msg("Failed to join multicast group using local addr - maybe there's a problem with your DNS/hosts setup?\n");
+ mr.imr_interface.s_addr = INADDR_ANY;
+ if (setsockopt(fd, IPPROTO_IP,IP_ADD_MEMBERSHIP,
+ (char *)&mr, sizeof(mr)) < 0) {
+ perror("IP_ADD_MEMBERSHIP");
+ debug_msg("Failed to join multicast group- exiting\n");
+ exit(1);
+ }
+ }
}
} else
#endif /* IP_ADD_MEMBERSHIP */
@@ -560,7 +567,7 @@
/* Slightly nasty one here - set Mcast iface if local inteface
* is specified on command line
*/
- if (local_.is_set()) {
+ if (local_preset) {
u_int32_t locali = (IPAddress&)local_;
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(char*)&locali, sizeof(locali)) < 0) {
More information about the Sumover-dev
mailing list