ネットワークプログラミング用ソケット

TCPクライアント:
1.接続ソケットの確立、IPおよびポートの監視の設定、ソケット()
2.接続の確立
3.write()ネットワークストリームオブジェクトの送信データの
取得4.read()ネットワークストリームオブジェクトの受信データの取得
5。ソケットを閉じる

TCPサーバー
1.ポートリスニングソケットを確立します()
2.指定したポートをバインドします()
3.ポートモニタリングをリッスンします
4.クライアントアクセスがあるまでブロックします()ブロックします
5. クライアントから送信されたデータを取得します()
6。 write()は戻りデータを送信します
7.close
ここに画像の説明を挿入
は、クライアントとの接続を確立するためにサーバーが必要とするポートリスニング関数呼び出しを閉じます

1.
ソケットソケットを確立するためのソケット関数ソケット関数

int socket(int family, int type, int protocol);
返回值:成功返回非负描述符,若出错返回 -1;

int family:协议族 (socket 函数的family常值包括:
 AF_INET, AF_INET6, AF_LOCAL, AF_ROUTE, AF_KEY.

int type:套接字类型(SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAM)

int protocol:协议类型(IPPROTO_TCP, IPPROTO_UDP, IPPROTO_SCTP

(1)ファミリとタイプのすべての組み合わせが有効であるとは限らないため、プロトコルパラメータは通常、カーネルがプロトコルタイプを自動的に照合してエラーを回避できるように0に設定されます。
(2)アドレスファミリAF_XXX。プロトコルファミリPF_XXX。
(3)POSIX仕様は、ソケット関数の最初のパラメーターがPF_値であり、AF_値がソケットアドレス構造に使用されることを指定しています。

2.
接続機能 TCPクライアントは接続機能を使用してTCPサーバーとの接続を確立します

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 
返回值:  成功返回 0 ,出错返回 -1。

int sockfd: socket函数返回的套接字描述符。

const struct *servaddr: 指向套接字地址结构的指针。

socklen_t addrlen: 套接字地址结构的的大小。

(1)渡されるソケットアドレス構造には、サーバーのIPアドレスとポート番号が含まれている必要があります。
(2)connectを呼び出すときにクライアントがbind関数を呼び出す必要はなく、カーネルは必要に応じてソースIPアドレスを決定し、一時ポートをソースポートとして選択します。
(3)接続機能は、TCPの3ウェイハンドシェイクプロセスを刺激します。
(4)接続がエラーで戻るいくつかの状況:

  • TCPクライアントが指定された時間内にSYNセクションから応答を受信しない場合、ETIMEOUTエラーを返します
  • クライアントのSYNへの応答がRST(相手の接続がリセットされる)の場合、サーバーホストには、指定したポートで接続を待機しているプロセスがないことを意味します。これはハードエラーであり、RSTを受信するとすぐにECONNREFUSEDエラーが返されます。RSTセグメントを生成するための3つの条件は次のとおりです。宛先がポートのSYNであるが、そのポートでリッスンしているサーバーがない、TCPが既存の接続をキャンセルしたい、TCPが存在しない接続でセグメントを受信する祭り
  • クライアントによって発行されたSYNが中間ルーターで「宛先到達不能」ICMPエラーをトリガーした場合、ソフトエラーと見なされ、クライアントはメッセージをカーネルに保存します。そして、特定の時間間隔でSYNを送信し続け、指定された時間内に応答を受信して​​いません。保存されたメッセージは、EHOSTUNREACH(ENETUNREACHエラーは古いENETUNREACHがEHOSTUNREACHとして扱われる)エラーとしてプロセスに返されます。

(5)接続呼び出しが失敗した場合、ソケット記述子は使用できなくなり、閉じる必要があります

3. bind関数
bind関数は、ローカルプロトコルアドレスをソケットに割り当てますTCP / IPプロトコルの場合、プロトコルアドレスはIPアドレスとポート番号の組み合わせです。

int bind(int sockfd, cosnt struct sockaddr *myaddr, socklen_t addrlen);
返回值:成功返回0,出错返回 -1

int sockfd: 由socket函数返回的套接字描述符。

const struct sockaddr *myaddr: 指向特定于协议的套接字地址结构的指针。

socklen_t : 套接字地址结构的大小。

バインディング操作には、ソケット、アドレス、ポートの3つのオブジェクトが含まれます。ソケットはバインドの対象であり、アドレスとポートはソケットにバインドされたオブジェクトです
(1)bind関数を使用して、IPアドレスとポート番号の両方、またはIPアドレスまたはポート番号のみを指定できます。
(2)RPCサーバーを除いて(ポートマッパーを使用)、他のすべてのサーバーはbindを呼び出して、少なくともサービスポート番号をバインドする必要があります。
(3)クライアントプログラムが特定のポート番号を指定する必要がない場合、クライアントプログラムは通常バインド関数を呼び出さず、カーネルはクライアントプログラムにIPアドレスとポート番号を割り当てます。
(4)bind関数を呼び出して、マシンのインターフェースに属するIPアドレスをソケットにバインドする場合:クライアントプログラムの場合、このIPアドレスは送信されたデータグラムのソースIPアドレスです。サーバーの場合、このIPアドレス宛てのクライアントプログラムからの接続のみを受信するようにサーバーを制限します。
(5)バインドするアドレスが使用されている場合、bindはEADDRINUSEエラーを返します。
(6)bind関数はバインドされたIPアドレスとポート番号を返さないため、getsocknameを呼び出すことでこの情報を取得できます。
(7)bindは異なるサーバーに異なるIPをバインドします。同じマルチホームマシンで複数のサーバーコピーを実行でき、各コピーは特定の顧客にサービスを提供します。
(8)パケットの到着インターフェイスとパケットの宛先IPアドレス、強力なシステムモデルと脆弱なシステム

4. listen関数
listen関数は、TCPサーバーによってのみ呼び出されます。

int listen(int sockfd, int backlog);返回值:成功返回0 出错返回 -1。

int sockfd: socket 函数返回的套接字描述符。

int backlog: 已连接套接字的已完成连接的最大排队数。

(1)listen関数は、接続されていないソケットをパッシブソケットに変換し、ソケットへの接続要求を受け入れるようにカーネルに指示します。
(2)カーネルは、リスニングソケットごとに、完了した接続キュー(不完全な接続キュー)と不完全な接続キュー(完了した接続キュー)の2つのキューを保持します。
(3)不完全な接続キュー:クライアントのSYNがサーバーに到達し、サーバーは3ウェイハンドシェイクの完了を待機しています。このような接続は不完全な接続キューに置かれ、ソケットはSYN_RCVD状態です。
(4)完了した接続キュー:正常に完了した3ウェイハンドシェイク接続は、完了した接続キューに配置されます。ソケットはESTABLISHED状態です。
(5)バックログパラメータは、特定のソケットのカーネルによってキューに入れられる完了した接続の最大数を指定します。
(6)完了した接続の数を制限する目的は、(何らかの理由で)特定のソケットをリッスンするアプリケーションプロセスが接続の受け入れを停止したときに、カーネルがソケットで新しい接続を受け入れ続けることを防ぐことです。接続要求。
(7)多数の未処理の接続キューがカーネルによって処理されます。
(8)キューがいっぱいの場合、新しいクライアントのSYNがTCPに到着すると、SYNは無視され、通常はエラーメッセージが返されません。

5. accept関数
accept関数は、TCPサーバーによって呼び出され、完了した接続キューの先頭から次の完了した接続を返します。完了した接続キューが空の場合、プロセスはスリープ状態になります(ソケットがデフォルトのブロッキングメソッドの場合)。 )。

int accept(int sockfd,struct sockaddr *cliaddr, socklen_t *addrlen);
返回值:成功返回非负的描述符,出错返回 -1。

int sockfd : 一个监听套接字。

struct sockaddr *cliaddr : 套接字地址结构的指针,用来返回已连接的对端进程的协议地址。

socklen_t *addrlen: 函数调用的时候是传入的套接字地址结构的大小,函数返回时它的值是内核存放在该套接字地址结构中的确切字节数。

(1)Acceptが正常に戻ると、接続されたソケットと呼ばれる新しいソケットが生成され、クライアントとのデータ転送に使用されます。
(2)サーバーは通常、サーバーのライフサイクル全体にわたって存在する待機ソケット(待機ソケット)のみを作成します。
(3)カーネルは、サーバープロセスによって受け入れられたクライアント接続ごとに接続ソケットを作成し、サーバーがクライアントへのサービスを完了すると、対応するソケットが閉じられます。
(4)accept関数は最大3つの値を返します。1つは、新しいソケット記述子、またはエラーが示す整数、クライアントプロセスのプロトコルアドレス、およびアドレスのサイズのいずれかです。

6.読み取り()、書き込み()およびその他の関数これ
までのところ、サーバーとクライアントは接続を確立しています。ネットワークI / Oを呼び出して、読み取りおよび書き込み操作を実行できます。つまり、ネットワーク内の異なるプロセス間の通信を実現できます。

read関数はfdからコンテンツを読み取る役割を果たします。読み取りが成功すると、readは実際に読み取られたバイト数を返します。戻り値が0の場合、ファイルの終わりが読み取られたことを意味します。エラーがEINTRの場合、読み取りは中断が原因であり、ECONNRESTの場合、ネットワーク接続に問題があります。

write関数は、bufのnbytesバイトの内容をファイル記述子fdに書き込み、成功すると、書き込まれたバイト数を返します。失敗すると-1を返し、errno変数を設定します。ネットワークプログラムでは、ソケットファイル記述子に書き込むときに2つの可能性があります。1)writeの戻り値は0より大きく、データの一部またはすべてが書き込まれたことを示します。2)戻り値が0未満であり、現時点でエラーが発生しています。エラーの種類に応じて対処する必要があります。エラーがEINTRの場合、書き込み中に割り込みエラーが発生しました。EPIPEの場合は、ネットワーク接続に問題があります(相手が接続を閉じました)。

7. close()関数
サーバーはクライアントとの接続を確立した後、いくつかの読み取りおよび書き込み操作を実行します。読み取りおよび書き込み操作が完了すると、対応するソケット記述子が閉じられます。操作後にfcloseを呼び出して、開いているファイルを閉じます。

int close(int fd);
close一个TCP socket的缺省行为时把该socket标记为以关闭,
然后立即返回到调用进程。该描述字不能再由调用进程使用,
也就是说不能再作为read或write的第一个参数。

注:クローズ操作では、対応するソケット記述子の参照カウントが-1になるだけです。参照カウントが0の場合にのみ、TCPクライアントがトリガーされ、接続終了要求がサーバーに送信されます。

162の元の記事を公開 58を賞賛 90,000ビュー

おすすめ

転載: blog.csdn.net/ThreeAspects/article/details/105570390