私はUnixでのネットワークプログラミングについて学び、現在、ソケットとファイル記述子の概念を理解しようとしています。私が理解したことから、ファイル記述子は単にポインタの配列(ファイル記述子テーブル?)内の位置であり、これらのポインタはメモリ内のどこかにあるファイルを指しています。
ソケット記述子はこの配列をファイル記述子と共有しますが、ポインターは代わりにソケットを参照します。それとも、ソケットにのみ使用されるものは他にありますか?
この配列はすべてのアプリケーション/プロセスに固有ですか?
はい、ソケットはファイルと同じテーブルへのインデックスでもあります。少なくともUNIXシステム(LinuxやOSXなど)では、Windowsが異なります。そのため、たとえば、 read
およびwrite
は、データを送受信します。
各プロセスには、独自の「ファイル」記述子テーブルがあります。
ソケットは、UNIXオペレーティングシステムのファイルに他なりません。 UNIXオペレーティングシステムでは、すべてがファイルとして扱われます。ソケットを作成するたびに、標準I/Oと標準エラーおよびその他の詳細を含むファイル記述子テーブルにエントリが作成されます。ファイル記述子は、実行するアクション(読み取り、書き込みなど)に関する情報を含むファイルテーブルへのポインターとして機能し、その特定のファイルのiノードテーブルへのポインターを含みます。ご存知のとおり、iノードには必要なものがすべて含まれています。ファイルの詳細。
ソケット記述子とファイル記述子に違いはありません。ソケットは単なる特殊な形式のファイルです。ファイル記述子で使用されるのと同じシステムコールread()およびwrite()を使用できます。
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
Send()とwrite()の唯一の違いは、フラグの存在です。ゼロフラグ引数を使用すると、send()はwrite()と同等になります。