2011-10-15 17 views
7

私は次のようにTCPソケットの記述子を得た:ソケットの記述子をファイルポインタに変換できますか?

int desc = accept(socket_descriptor, &client_address, &len)

を今、この記述子descから私は、ファイルポインタを取得したいです。ここでfdopen()を使用できますか?

ファイルポインタを取得する理由は、ローカルファイルにデータを書き込む既存のコードを変更するためです。さて、私はその機能を拡張して、代わりにTCPクライアントに書き込むことができます。私はすべての機能を書き直したくないし、どうにかして既存のインフラストラクチャを使うことができると考えていました。既存の関数はファイルポインターを使用してファイルに書き込みます。変更を加えずに同じ機能をTCPストリームに書き込むことが可能かどうか疑問に思っていました。

答えて

8

はい、fdopen()は必要なものです。ここman pageはそれについて言っているされているもの:

fdopen()関数は、既存のファイル 記述子、FDストリームを結びつけます。ストリームのモード(値 "r"、 "r +"、 "w"、 "w"、 "a"、 "a +"のいずれか)は、ファイル 記述子のモードと互換性がなければなりません。新しいストリームのファイル位置インジケータはfdに属している に設定され、エラーおよびファイル終了インジケータは がクリアされます。モード "w"または "w +"は、ファイルの切り捨てを引き起こしません。 ファイル記述子はdupされず、fdopen()によって作成されたストリーム が閉じられると閉じられます。共有メモリオブジェクト にfdopen()を適用した結果は未定義です。

ただし、ソケット記述子に適用する場合は注意して使用してください。高レベルI/O機能はバッファリングを使用し、データを別々に送信することができる(つまり、ストリーム内に\nが見つかるたびにフラッシュする、\rを挿入するなど)。

+1

ほとんどのファイルは 'stdout'のみでバッファされています。ファイルをラインバッファにする方法があるのか​​どうかはわかりませんが、ほとんどがブロックされていると思います。 –

+0

@ChrisLutz:この関数は 'setlinebuf'です。私は 'stdout'は端末に接続されていればバッファされた行だけだと思いますが、わかりません。 –

+0

@DietrichEpp - ありがとうございます。そして、あなたは 'stdout'について正しいと思います。 –

関連する問題