[转]Windows下模拟linux pipe

newdye 2012-03-09

linux下的管道可以通过select来捕获事件,在某些场景下非常有用,但Windows下提供的管道就不具备这种特性,为了在Windows环境下也可以实现类似的功能特性,可以用socket模拟pipe实现。代码如下:from http://blog.chinaunix.net/space.php?uid=736168&do=blog&cuid=705924

int pipe( int fildes[ 2] )

{

int tcp1, tcp2;

sockaddr_in name;

memset ( & name, 0, sizeof ( name) ) ;

name. sin_family= AF_INET ;

name. sin_addr. s_addr= htonl ( INADDR_LOOPBACK ) ;

int namelen= sizeof ( name) ;

tcp1= tcp2= - 1;

int tcp= socket ( AF_INET , SOCK_STREAM , 0) ;

if ( tcp= = - 1) {

goto clean;

}

if ( bind ( tcp, ( sockaddr * ) & name, namelen) = = - 1) {

goto clean;

}

if ( listen ( tcp, 5) = = - 1) {

goto clean;

}

if ( getsockname ( tcp, ( sockaddr * ) & name, & namelen) = = - 1) {

goto clean;

}

tcp1= socket ( AF_INET , SOCK_STREAM , 0) ;

if ( tcp1= = - 1) {

goto clean;

}

if ( - 1= = connect ( tcp1, ( sockaddr * ) & name, namelen) ) {

goto clean;

}

tcp2= accept ( tcp, ( sockaddr * ) & name, & namelen) ;

if ( tcp2= = - 1) {

goto clean;

}

if ( closesocket( tcp) = = - 1) {

goto clean;

}

fildes[ 0] = tcp1;

fildes[ 1] = tcp2;

return 0;

clean:

if ( tcp! = - 1) {

closesocket( tcp) ;

}

if ( tcp2! = - 1) {

closesocket( tcp2) ;

}

if ( tcp1! = - 1) {

closesocket( tcp1) ;

}

return - 1;

}

缺点很明显
1、效率低下。

2、占用了两个TCP端口。

3、accept的返回值未必就是tcp1连接过来的(多线程或者别的进程在干预),所以最好通过发送数据进行确认。

4、由于不是匿名的,所以可以在netstat里面看到。

优点只有一个,可以使用select调用。

相关推荐