-3

ソケットはネットワークプログラムで広く使われていることを知っており、それを使ってコードを書くことができます。しかし、私はいくつかのことを理解できません:

1. なぜソケットが必要なのですか?

ネットワーク層ごとにアプリケーション層プログラムを区別するために使用する場合、アプリケーション名またはその他の一意の属性を使用しないのはなぜですか?

ソケットは標準ですか?

ソケットはLinuxまたは他のOSの単なる構造ですか?

2. ソケットはどのように機能しますか?

bind、accept、listen、send など、ソケットの周りには多くの関数があります。msg を tcp バッファに送信しますか? ネットワーク層プロセスが tcp バッファ データを読み取る方法と、データを下位層プロセスに送信する方法は?

関数を使用した場合send(int sockfd, const void *buf, size_t len, int flags)、最初の引数 'sockfd' はランダムな int などの未定義のソケットです。どのような結果が発生し、その理由は? os は何を処理しますか?

4

2 に答える 2

3

UNIX では、ソケットは一種のファイル記述子です。Windows では、SOCKET は一種の HANDLE です。ファイル記述子とハンドルは、これらの OS がさまざまな操作 (読み取りや書き込みなど) をリソースに対して実行できるようにする方法です。したがって、ネットワーク接続は、OS のネットワーク サービスによって提供される OS リソースと見なされます。

ソケット API は多かれ少なかれ標準ですが、各 OS は OS 固有の API と、標準 API の OS 固有のオプションを提供する場合があります。

ソケットの基礎となる実装には、構造が含まれている可能性が非常に高いです。

OS がソケット API を実装する方法は、他のシステム コールを実装する場合と大差ありません。API は最終的に、send()ネットワーク スタックにデータを配信するシステム コールに変換されます。ネットワーク スタックは独自のバッファを管理しますが、send()通常、ユーザー空間のデータがネットワーク バッファにコピーされます (これは、write()システム コールが呼び出されたときに起こることと同じです)。ネットワーク スタックは、そのコードを介してデータを処理し、さまざまな層に渡します (通常: ソケット -> TCP -> IP -> イーサネット ドライバー)。最下層では、OS が物理デバイスとの通信に使用するデバイス ドライバーと同様です。

非ソケット ファイル記述子を に渡すと、 、、またはsend()のいずれかのエラーが発生する可能性が高いと思います。EBADFEINVALENOTSOCK

于 2013-07-18T07:19:13.057 に答える