[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