diff -r 06cc275ce9e6 wengophone/src/model/network/NetworkObserver.cpp
--- a/wengophone/src/model/network/NetworkObserver.cpp	Mon Nov 17 11:43:04 2008 +0100
+++ b/wengophone/src/model/network/NetworkObserver.cpp	Mon Nov 17 14:15:01 2008 +0100
@@ -24,11 +24,29 @@
 //#include <netlib.h>
 #include <QtNetwork/QtNetwork>
 
-#define RETRIES 8
+//#define RETRIES 8
+
+#if defined(WIN32)
+#include <Windows.h>
+#include <Iphlpapi.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <unistd.h>
+#include <sys/param.h>
+
+#include <stdio.h>
+#endif
 
 NetworkObserver::NetworkObserver() 
 {
-	_prevstate = 0;
+	//_prevstate = 0;
 	_isConnected = (is_connection_available() ? true : false);
 	//_timer.timeoutEvent += boost::bind(&NetworkObserver::timeoutEventHandler, this);
 
@@ -73,13 +91,13 @@
 	{
 		if (!_isConnected)
 		{
-			if(!_prevstate)
-			{
+			//if(!_prevstate)
+			//{
 				LOG_DEBUG("Connection is up");
 				_isConnected = true;
 				connectionIsUpEvent(*this);
-			}
-			_prevstate--;
+			//}
+			//_prevstate--;
 		}
 	}
 	else
@@ -89,7 +107,7 @@
 			LOG_DEBUG("Connection is down");
 			_isConnected = false;
 			connectionIsDownEvent(*this);
-			_prevstate = RETRIES;
+			//_prevstate = RETRIES;
 		}
 	}
 }
@@ -107,13 +125,15 @@
 				continue;
 
 
-			if( (*it).flags() & QNetworkInterface::IsUp || (*it).flags() & QNetworkInterface::IsRunning )
+			if( (*it).flags() & QNetworkInterface::IsUp && (*it).flags() & QNetworkInterface::IsRunning )
 			{
 				QList<QNetworkAddressEntry> list2 = (*it).addressEntries  ();
 				for(QList<QNetworkAddressEntry>::iterator itt = list2.begin() ; itt != list2.end();itt++ )
 				{
 					if(!(*itt).ip().isNull() && (*itt).ip().protocol() == QAbstractSocket::IPv4Protocol)
-						return true;
+					{
+						return canConnect();						
+					}
 				}
 			}
 		}
@@ -121,3 +141,209 @@
 
 	return false;
 }
+
+
+
+bool NetworkObserver::canConnect()
+{
+#if defined(WIN32)
+/* w2000 and W95/98 */
+	unsigned long  best_interface_index;
+	DWORD hr;
+
+	/* NT4 (sp4 only?) */
+	PMIB_IPFORWARDTABLE ipfwdt;
+	DWORD siz_ipfwd_table = 0;
+	unsigned int ipf_cnt;
+
+	best_interface_index = -1;
+	/* w2000 and W95/98 only */
+	hr = GetBestInterface(inet_addr("217.12.3.11"),&best_interface_index);
+	if (hr)
+	{
+		LPVOID lpMsgBuf;
+		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+			FORMAT_MESSAGE_FROM_SYSTEM |
+			FORMAT_MESSAGE_IGNORE_INSERTS,
+			NULL,
+			hr,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			(LPSTR) &lpMsgBuf, 0, NULL);
+		best_interface_index = -1;
+	}
+
+	if (best_interface_index != -1)
+	{ /* probably W2000 or W95/W98 */
+		char *servername;
+		char *serverip;
+		char *netmask;
+
+		if (ppl_dns_get_local_fqdn(&servername, &serverip, &netmask,
+						best_interface_index))
+		{
+			/*if(servername)
+				delete servername;
+			if(serverip)
+				delete serverip;
+			if(netmask)
+				delete netmask;*/
+			
+			return true;
+		}
+		return false;
+	}
+
+
+	if (!GetIpForwardTable(NULL, &siz_ipfwd_table, FALSE) == ERROR_INSUFFICIENT_BUFFER
+		|| !(ipfwdt = (PMIB_IPFORWARDTABLE) alloca (siz_ipfwd_table)))
+	{
+		return false;
+	}
+
+
+	/* NT4 (sp4 support only?) */
+	if (!GetIpForwardTable(ipfwdt, &siz_ipfwd_table, FALSE))
+	{
+		for (ipf_cnt = 0; ipf_cnt < ipfwdt->dwNumEntries; ++ipf_cnt) 
+		{
+			if (ipfwdt->table[ipf_cnt].dwForwardDest == 0)
+			{ /* default gateway found */
+				char *servername;
+				char *serverip;
+				char *netmask;
+
+				if (ppl_dns_get_local_fqdn(&servername,
+								 &serverip,
+								 &netmask,
+								 ipfwdt->table[ipf_cnt].dwForwardIfIndex))
+				{
+					delete servername;
+					delete serverip;
+					delete netmask;
+					return true;
+				}
+				return false;
+			}
+		}
+
+	}
+	/* no default gateway interface found */
+	return true;
+
+#else
+
+	#if defined(OS_MACOSX)
+		int len;
+	#else
+		unsigned int len;
+	#endif
+	int sock_rt, on=1;
+	struct sockaddr_in iface_out;
+	struct sockaddr_in remote;
+
+	memset(&remote, 0, sizeof(struct sockaddr_in));
+
+	remote.sin_family = AF_INET;
+	remote.sin_addr.s_addr = inet_addr("217.12.3.11");
+	remote.sin_port = htons(11111);
+
+	memset(&iface_out, 0, sizeof(iface_out));
+	sock_rt = socket(AF_INET, SOCK_DGRAM, 0 );
+
+	if (setsockopt(sock_rt, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) == -1) 
+	{
+		close(sock_rt);
+		return false;
+	}
+
+	if (connect(sock_rt, (struct sockaddr*)&remote, sizeof(struct sockaddr_in)) == -1 ) 
+	{
+		close(sock_rt);
+		return false;
+	}
+
+	len = sizeof(iface_out);
+	if (getsockname(sock_rt, (struct sockaddr *)&iface_out, &len) == -1 ) 
+	{
+		close(sock_rt);
+		return false;
+	}
+
+	close(sock_rt);
+	if (iface_out.sin_addr.s_addr == 0)
+	{ /* what is this case?? */
+		return false;
+	}
+
+	return true;
+
+#endif
+}
+
+#if defined(WIN32)
+bool NetworkObserver::ppl_dns_get_local_fqdn (char **servername, char **serverip,char **netmask, unsigned int WIN32_interface)
+{
+	unsigned int pos;
+
+	*servername = NULL; /* no name on win32? */
+	*serverip   = NULL;
+	*netmask    = NULL;
+
+	/* First, try to get the interface where we should listen */
+	{
+		DWORD size_of_iptable = 0;
+		PMIB_IPADDRTABLE ipt;
+		PMIB_IFROW ifrow;
+
+		if (GetIpAddrTable(NULL, &size_of_iptable, TRUE) == ERROR_INSUFFICIENT_BUFFER)
+		{
+			ifrow = (PMIB_IFROW) _alloca (sizeof(MIB_IFROW));
+			ipt = (PMIB_IPADDRTABLE) _alloca (size_of_iptable);
+			if (ifrow==NULL || ipt==NULL)
+			{
+				/* not very usefull to continue */
+				return true;
+			}
+
+			if (!GetIpAddrTable(ipt, &size_of_iptable, TRUE))
+			{
+				/* look for the best public interface */
+
+				for (pos=0; pos < ipt->dwNumEntries && *netmask==NULL ; ++pos)
+				{
+					/* index is */
+					struct in_addr addr;
+					struct in_addr mask;
+					ifrow->dwIndex = ipt->table[pos].dwIndex;
+					if (GetIfEntry(ifrow) == NO_ERROR)
+					{
+						switch(ifrow->dwType)
+						{
+						case MIB_IF_TYPE_LOOPBACK:
+						  /*	break; */
+						case MIB_IF_TYPE_ETHERNET:
+						default:
+							addr.s_addr = ipt->table[pos].dwAddr;
+							mask.s_addr = ipt->table[pos].dwMask;
+							if (ipt->table[pos].dwIndex == WIN32_interface)
+							{
+								*servername = NULL; /* no name on win32? */
+								*serverip   = inet_ntoa(addr);
+								*netmask    = inet_ntoa(mask);
+								break;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	if (*serverip==NULL || *netmask==NULL)
+	{
+		return false;
+	}
+
+	return true;
+}
+#endif
diff -r 06cc275ce9e6 wengophone/src/model/network/NetworkObserver.h
--- a/wengophone/src/model/network/NetworkObserver.h	Mon Nov 17 11:43:04 2008 +0100
+++ b/wengophone/src/model/network/NetworkObserver.h	Mon Nov 17 14:15:01 2008 +0100
@@ -69,7 +69,13 @@
 
 	bool _isConnected;
 
-	int _prevstate;
+	//int _prevstate;
+
+	bool canConnect();
+
+#if defined(WIN32)
+	bool ppl_dns_get_local_fqdn (char **servername, char **serverip,char **netmask, unsigned int WIN32_interface);
+#endif
 
 protected:
 	void timerEvent(QTimerEvent*);
diff -r 06cc275ce9e6 wifo/eXosip/src/eXutils.c
--- a/wifo/eXosip/src/eXutils.c	Mon Nov 17 11:43:04 2008 +0100
+++ b/wifo/eXosip/src/eXutils.c	Mon Nov 17 14:15:01 2008 +0100
@@ -270,7 +270,7 @@
     return -1;
   }
   
-  if (connect(sock_rt, (struct sockaddr*)&remote, sizeof(struct sockaddr_in))
+  if (::connect(sock_rt, (struct sockaddr*)&remote, sizeof(struct sockaddr_in))
       == -1 ) {
     perror("DEBUG: [get_output_if] connect");
     close(sock_rt);
