2019年11月19日
午前8時17分40秒
参考ます。https://github.com/riba2534/TCP-IP-NetworkNote/tree/master/ch15
15.1標準I / Oの利点
2標準I / O機能の利点15.1.1
ここでは、標準I / O機能の2つの利点があります:
- 優れた携帯性と標準I / O機能
- 標準I / O関数は、バッファにより、パフォーマンスを向上させることができます
あなたはソケットを作成すると、オペレーティングシステムは、I / Oバッファリングできるようになります。このバッファは、TCPプロトコルの実装に非常に重要な役割を果たしています。標準I / O機能を使用している場合、この時点では、追加のバッファリングをサポートしました。図は次のとおりです。
それは送信機能fputs文字列「こんにちは」と仮定した場合、最初のデータは、標準I / Oバッファに送信し、その後、出力ソケットバッファにデータを移動し、最終的には他のホストに文字列を送信しています。
主な目的は、パフォーマンスを改善するためのバッファを設定することです。あなたは以下の2点から改善された性能を説明することができます:
- データ伝送量
- 出力データ・バッファへの携帯電話番号。
データの比較ケース1つのバイトを10回と10回のパケット送信状況を送信しました。データを送信する場合、データは、パケットヘッダ情報に含まれています。かかわらず、データチャネルの頭のサイズの、特定のフォーマットに従って充填されています。40バイトのヘッダ情報、大きな違いがあると、送信すべきデータの量を考えます。
- 1バイト10:40 * 10 = 400のバイト
- バイト10 1:40 * 1 = 40バイト。
標準I / O機能及びシステム機能間15.1.2性能比較
以下は、システム機能の使用例を示します。
以下は、システム機能の使用例を示します。
ここでファイルをコピーするための標準的なI / O機能であります
明らかに、標準的なI / O機能が高速に実行コードに基づいて上記2つのテストコード、のために
いくつかの欠点15.1.3標準I / O機能
標準I / O機能は、次のような欠点を提示します:
- 容易ではない双方向通信
- 時々、頻繁に通話機能をFFLUSH
- これは、必要なファイル構造体へのポインタとしてファイルディスクリプタを返します。
標準I / O機能を使用して15.2
15.2.1のfdopen関数は、構造体のポインタファイルを用いて形質転換され
次のように関数のプロトタイプは次のとおりです。
#含める<stdio.hに> FILEを* のfdopen(int型fildesは、あるCONST MODE * CHAR); / * 戻り正常に変換FILE構造体ポインタ、失敗に戻りNULL fildesで:ファイルディスクリプタ変換する必要モード:ファイルが作成されます。構造体へのポインタモード情報* /
以下は一例です:
desto.c
1の#include <stdio.hの> 2の#include <fcntl.h> 3 4 int型メイン(ボイド) 5 { 6 FILE * FP。 7 int型のfd =オープン(" DATA.DAT "、O_WRONLY | O_CREAT | O_TRUNC)。 8 もし(FD == - 1 ) 9 { 10 fputs(" ファイルオープンエラー" 、STDOUT)。 11 リターン - 1 。 12 } 13 14 FP =のfdopen(FD、「W " ); 15 fputs(" ネットワークCプログラミング\ n " 、FP); 16 FCLOSE(FP) 17 リターン 0 ; 18 }
変換されたファイルディスクリプタFILENOを使用して15.2.2機能
次のように関数のプロトタイプは次のとおりです。
#含める<stdio.hに> int型FILENO(FILE *ストリーム); / * 戻り、成功したファイルディスクリプタを、失敗した場合は-1 * /
例:
#含める<stdio.hに> #含める<fcntl.h > int型のmain(){ FILE * FPと、int型のfd = オープン("DATA.DAT "、O_WRONLY | O_CREAT | O_TRUNC)。IF(FD == - 1){ fputs("ファイルオープンエラー")。リターン- 1。} のprintf("最初のファイル記述子:%D \ n "、FD)。FP = のfdopen(FD、"W ")。//转成ファイル指针fputs("TCP / IPソケットプログラミング\ N "、FP); printf("第二のファイルディスクリプタ:%D \ N "、FILENO(FP));リターン0; }
15.3ソケットベースの標準I / O機能の使用
エコークライアントの第IV章の内容と、サーバは、標準I / O関数の形でエコーデータ交換に基づいて変更されます。
コードは以下の通りであります:
コンパイルして実行:
gccのecho_client.c -oのeClient
gccのecho_stdserv.c -oのeServer
結果:
ASは、同一の演算結果と標準I / O実装の使用であるIV、見ることができます。
15.3ソケットベースの標準I / O機能の使用
エコークライアントの第IV章の内容と、サーバは、標準I / O関数の形でエコーデータ交換に基づいて変更されます。
コードは以下の通りであります:
コンパイルして実行:
gccのecho_client.c -oのeClient
gccのecho_stdserv.c -oのeServer
結果:
ASは、同一の演算結果と標準I / O実装の使用であるIV、見ることができます。
15.4演習
以下の答えは、ビューの唯一の私の個人的なポイントを表す正しい答えではないかもしれません。
-
2つの標準I / Oのの利点を記入してください。彼は2つの利点があるのはこのためですか?
A:①パフォーマンスを向上させるために高い優れたバッファと②の移植。これらの機能は、ANSI C標準で定義されているからです。すべてのプログラミングに適しています。
-
送信データの標準I / O機能を使用する場合は、次の文は偽です。
送信データのfputs関数を呼び出すときに、呼び出しを開始すべき直後に送られました!
なぜ、上記の文は間違っていますか?プロセスを追加する必要があり、この効果を達成するために?
A:緩衝液のみに転送バッファにfflushをフラッシュするために使用されるべきです。