[Sumover-dev] [svn commit] r4699 - vic/branches/mpeg4/net

sumover-dev at cs.ucl.ac.uk sumover-dev at cs.ucl.ac.uk
Fri Mar 19 13:48:18 GMT 2010


Author: piers
Date: Fri Mar 19 13:48:18 2010
New Revision: 4699

Modified:
   vic/branches/mpeg4/net/net-ip.cpp

Log:
Fixed bug when trying to send in unicast and hopefully on Win7 too. In my connect/disconnect() fix I also 'cleaned' up the sockaddr declarations (sin) - This was an error as the sin structure was being used by ::sendto() in dosend() - and relying on it being setup in ssock(). I renamed the sin member variable to sin_ (and anotheri(local_preset) so the member variables are '_' postfixed - good idea in general), and added local declarations of sin as and where needed.


Modified: vic/branches/mpeg4/net/net-ip.cpp
==============================================================================
--- vic/branches/mpeg4/net/net-ip.cpp	(original)
+++ vic/branches/mpeg4/net/net-ip.cpp	Fri Mar 19 13:48:18 2010
@@ -96,7 +96,7 @@
 
 class IPNetwork : public Network {
     public:
-		IPNetwork() : Network(*(new IPAddress), *(new IPAddress), *(new IPAddress)), local_preset(0) {;}
+		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) { 
@@ -111,17 +111,18 @@
     		return (result);
   	}
     protected:
-	struct sockaddr_in sin;
+	struct sockaddr_in sin_;//Sockaddr setup in ssock, used by sendto in dosend
+	time_t last_reset_;
+	int    local_preset_;// Indicates if local_ has been set on cmd line
+
 	virtual int dorecv(u_char* buf, int len, Address &from, int fd);
 	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 disconnect_sock(int fd);
 	int openrsock(Address & g_addr, Address & s_addr_ssm, u_short port, Address & local);
 	void dosend(u_char* buf, int len, int fd);
-	time_t last_reset_;
 };
 
 static class IPNetworkMatcher : public Matcher {
@@ -210,7 +211,7 @@
 			int ttl = atoi(argv[4]);
 			if (strlen(tcl.attr("ifAddr"))>1) {
 				(IPAddress&)local_ = tcl.attr("ifAddr");
-				local_preset=1;
+				local_preset_=1;
                         }
 			if (open(argv[2], port, ttl) < 0)
 				tcl.result("0");
@@ -297,7 +298,7 @@
 #endif
 
 	// Use Local interface name if already set via command line
-	if (local_preset) {
+	if (local_preset_) {
 		p->sin_addr.s_addr=(IPAddress&)local_;
 		debug_msg("Setting localname from cmd line:%s\n",(const char*)local_);
 		return (0);
@@ -335,6 +336,7 @@
 int IPNetwork::openrsock(Address & g_addr, Address & s_addr_ssm, u_short port, Address & local)
 {
 	int fd;
+        struct sockaddr_in sin;
 
 	u_int32_t g_addri = (IPAddress&)g_addr;
 	u_int32_t g_addri_ssm = (IPAddress&)s_addr_ssm;
@@ -382,6 +384,7 @@
 		if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
 			sin.sin_addr.s_addr = INADDR_ANY;
 			if (bind(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) {
+                                debug_msg("Error binding Recv mcast socket\n");
 				perror("bind");
 				exit(1);
 			}
@@ -422,7 +425,7 @@
 		struct ip_mreq mr;
 
 		mr.imr_multiaddr.s_addr = g_addri;
-		if (local_preset) {
+		if (local_preset_) {
 		    mr.imr_interface.s_addr = locali;
 		    if (setsockopt(fd, IPPROTO_IP,IP_ADD_MEMBERSHIP, 
 				    (char *)&mr, sizeof(mr)) < 0) {
@@ -449,9 +452,10 @@
 		 */
 		sin.sin_addr.s_addr = locali;
 		if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+                        debug_msg("Error binding Recv ucast socket\n");
 			perror("bind");
-            ::close(fd);
-            return (-1);
+                        ::close(fd);
+                        return (-1);
 		}
 		/*
 		 * Despite several attempts on our part to get this fixed,
@@ -516,27 +520,28 @@
 	}
 #endif
 
-	memset((char *)&sin, 0, sizeof(sin));
-	sin.sin_family = AF_INET;
-	sin.sin_port = port;
-	sin.sin_addr.s_addr = INADDR_ANY;
-	if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
-	  sin.sin_port = 0;
-	  if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+	memset((char *)&sin_, 0, sizeof(sin_));
+	sin_.sin_family = AF_INET;
+	sin_.sin_port = port;
+	sin_.sin_addr.s_addr = INADDR_ANY;
+	if (bind(fd, (struct sockaddr *)&sin_, sizeof(sin_)) < 0) {
+	  sin_.sin_port = 0;
+	  if (bind(fd, (struct sockaddr *)&sin_, sizeof(sin_)) < 0) {
+              debug_msg("Error binding send socket\n");
 	      perror("bind");
 	      exit(1);
 	  }
 	}
 
-	memset((char *)&sin, 0, sizeof(sin));
-	sin.sin_family = AF_INET;
-	sin.sin_port = port;
-	sin.sin_addr.s_addr = addri;
-
-	/* Connect() is useful for localname() call to find the iface addr being used
-	 * Because of a problem with OSX we disconnect this socket once localname() has 
-	 * found out the ip address of the interface */
- 	if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+	memset((char *)&sin_, 0, sizeof(sin_));
+	sin_.sin_family = AF_INET;
+	sin_.sin_port = port;
+	sin_.sin_addr.s_addr = addri;
+
+	/* Connect() is useful for localname() to find the interface addr
+         * being used. Also because of a problem with OSX we disconnect this
+         * socket once localname() has found out the ip addr of the iface */
+ 	if (connect(fd, (struct sockaddr *)&sin_, sizeof(sin_)) < 0) {
 		perror("connect");
 		exit(1);
 	}
@@ -572,7 +577,7 @@
 		/* Slightly nasty one here - set Mcast iface if local inteface
 		 * is specified on command line
 		 */
-		if (local_preset) {
+		if (local_preset_) {
 			u_int32_t locali = (IPAddress&)local_;
 			if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
 						   (char*)&locali, sizeof(locali)) < 0) {
@@ -603,6 +608,8 @@
 
 int IPNetwork::disconnect_sock(int fd)
 {
+        struct sockaddr_in sin;
+
 	memset((char *)&sin, 0, sizeof(sin));
 	sin.sin_family = AF_UNSPEC;
 	return connect(fd, (struct sockaddr *)&sin, sizeof(sin));
@@ -634,7 +641,7 @@
 
 void IPNetwork::dosend(u_char* buf, int len, int fd)
 {
-	int cc = ::sendto(fd, (char*)buf, len, 0, (struct sockaddr *)&sin, sizeof(sin));
+	int cc = ::sendto(fd, (char*)buf, len, 0, (struct sockaddr *)&sin_, sizeof(sin_));
 	if (cc < 0) {
 		switch (errno) {
 		case ECONNREFUSED:



More information about the Sumover-dev mailing list