r3226 - trunk/libmnetutil/source

mikma at minisip.org mikma at minisip.org
Tue Mar 6 22:18:53 CET 2007


Author: mikma
Date: 2007-03-06 22:18:52 +0100 (Tue, 06 Mar 2007)
New Revision: 3226

Modified:
   trunk/libmnetutil/source/SocketServer.cxx
Log:
Fix WIN32 pipe using TCP sockets

Modified: trunk/libmnetutil/source/SocketServer.cxx
===================================================================
--- trunk/libmnetutil/source/SocketServer.cxx	2007-02-27 11:06:55 UTC (rev 3225)
+++ trunk/libmnetutil/source/SocketServer.cxx	2007-03-06 21:18:52 UTC (rev 3226)
@@ -30,8 +30,9 @@
 #ifdef WIN32
 # include<io.h>
 # include<fcntl.h>
-# define write _write
-# define pipe(fds) _pipe((fds), 256, O_BINARY)
+typedef int socklen_t;
+#else
+#define closesocket close
 #endif
 
 #ifndef SOCKET
@@ -158,7 +159,11 @@
 	if( fdSignal < 0 )
 		return;
 
+#ifdef WIN32
+ 	if( send( fdSignal, &c, sizeof( c ), 0) < 0 ) {
+#else
 	if( write( fdSignal, &c, sizeof( c )) < 0 ) {
+#endif
 		cerr << "Write failed " << fdSignal << endl;
 		throw NetworkException( errno );
 	}
@@ -166,7 +171,7 @@
 
 int SocketServer::buildFdSet( fd_set *set, int pipeFd )
 {
-	SOCKET maxFd;
+	SOCKET maxFd = -1;
 	Sockets::const_iterator i;
 
 	FD_ZERO( set );
@@ -186,13 +191,72 @@
 	return maxFd;
 }
 
+#ifdef WIN32
+static int createTcpPipe( int fds[2] )
+{
+	SOCKET sd;
+	struct sockaddr_in sa;
+	socklen_t sz = sizeof(sa);
+	u_long nonBlocking = 1;
+
+	sd = socket( AF_INET, SOCK_STREAM, 0 );
+	if( sd < 0 ){
+		throw NetworkException( errno );
+	}
+
+	memset( &sa, 0, sz );
+	sa.sin_addr.s_addr = inet_addr("127.0.0.1");
+	sa.sin_family = AF_INET;
+
+	bind( sd, (struct sockaddr *)&sa, sz );
+
+	if( listen( sd, 1 ) < 0 ){
+		closesocket( sd );
+		throw NetworkException( errno );
+	}
+
+	if( getsockname( sd, (struct sockaddr *)&sa, &sz )){
+		closesocket( sd );
+		closesocket( fds[0] );
+		throw GetSockNameFailed( errno );
+	}
+
+	fds[0] = socket( AF_INET, SOCK_STREAM, 0 );
+	if( fds[0] < 0 ){
+		closesocket( sd );
+		throw NetworkException( errno );
+	}
+
+	if( connect( fds[0], (struct sockaddr *)&sa, sz ) < 0 ){
+		closesocket( sd );
+		closesocket( fds[0] );
+		throw GetSockNameFailed( errno );
+	}		
+
+	sz = sizeof( sa );
+	fds[1] = accept( sd, (struct sockaddr *)&sa, &sz );
+
+	if( fds[1] < 0 ){
+		closesocket( sd );
+		closesocket( fds[0] );
+		throw NetworkException( errno );
+	}
+
+	ioctlsocket( fds[0], FIONBIO, &nonBlocking);
+	ioctlsocket( fds[1], FIONBIO, &nonBlocking);
+
+	closesocket( sd );
+	return 0;
+}
+#endif	// WIN32
+
 void SocketServer::run()
 {
 	struct timeval timeout;
 	fd_set tmpl;
 	fd_set set;
 	int pipeFds[2] = {-1,-1};
-	int maxFd;
+	int maxFd = -1;
 	Sockets::const_iterator i;
 
 	csMutex.lock();
@@ -202,7 +266,12 @@
 		fdSignal = -1;
 	}
 
+#ifdef WIN32
+	// Use TCP sockets since Windows pipes don't support select
+	if( createTcpPipe( pipeFds )) {
+#else
 	if( ::pipe( pipeFds ) ){
+#endif
 		throw Exception( "Can't create pipe" );
 	}
 
@@ -231,7 +300,11 @@
 		if( FD_ISSET( pipeFds[0], &set ) ){
 			char buf[255];
 
+#ifdef WIN32
+			if( recv( pipeFds[0], buf, sizeof(buf), 0 ) < 0){
+#else
 			if( read( pipeFds[0], buf, sizeof(buf) ) < 0){
+#endif
 				cerr << "Read failed" << endl;
 				throw NetworkException( errno );
 			}
@@ -253,8 +326,8 @@
 // 	csMutex.lock();
 
 	fdSignal = -1;
-	close( pipeFds[0] );
-	close( pipeFds[1] );
+	closesocket( pipeFds[0] );
+	closesocket( pipeFds[1] );
 	doStop = false;
 
 // 	csMutex.unlock();



More information about the Minisip-devel mailing list