筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2009/No6_files/fdopen_sock.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2009/
http://www.coins.tsukuba.ac.jp/~yas/
128: int 129: fdopen_sock( int sock, FILE **inp, FILE **outp ) 130: { 131: int sock2 ; 132: if( (sock2=dup(sock)) < 0 ) 133: { 134: return( -1 ); 135: } 136: if( (*inp = fdopen( sock2, "r" )) == NULL ) 137: { 138: close( sock2 ); 139: return( -1 ); 140: } 141: if( (*outp = fdopen( sock, "w" )) == NULL ) 142: { 143: fclose( *inp ); 144: *inp = 0 ; 145: return( -1 ); 146: } 147: setvbuf(*outp, (char *)NULL, _IONBF, 0); 148: return( 0 ); 149: }fdopen_sock() は、dup() してファイル記述子を増やし、fdopen() を呼んで いる。fdopen() は、既に open() や pipe() 等で得られたファイル記述子から 高水準入出力ライブラリ が使えるようにするためのものである。 setvbuf() では、バッファリングを行わせないようにしている。これにより、 たとえば fprintf() を行うと、即座にネットワークに送り出される。