Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Unixネットワークプログラミングエントリー基本チュートリアル

Unixネットワークプログラミングエントリー基本チュートリアル

  
 

Unixはコンピュータで使用されている主流のオペレーティングシステムの1つであり、TCP /IPは広く使用されているインターネットプロトコルで、UnixはTCP /IPネットワークプログラミングのためのネットワークプロセス通信メカニズムを提供します。インタフェース(ソケットインタフェース)。この記事では、Unix環境におけるソケットの基本概念とプログラミング技法を紹介し、Socketsを使用してUNIXでクライアント/サーバー・プロセス通信を実装する方法を説明します。 1.ソケットの紹介ソケット(Socket)はネットワーク通信の基本的な操作単位であり、異なるホスト間の双方向通信のためのエンドポイントを提供します。この動作によりネットワーク通信機能が実現される。ソケットは次の3種類に分けられます。 1.バイトストリームソケットこれは最も一般的に使用されているソケットタイプで、TCP /IPプロトコルスイートのTCP(トランスポート制御プロトコル)プロトコルはこのタイプのインタフェースを使用し、接続指向(仮想回線の確立)とエラーフリーを提供します。一貫した送信順序、無制限のパケット長、および繰り返しのないネットワークパケット送信。 2.データグラムソケットTCP /IPプロトコルスイートのUDP(User Datagram Protocol)プロトコルは、このようなインタフェースを使用し、独立したエンベロープを使用してネットワーク伝送を行うコネクションレス型サービスで、エンベロープの最大長は32 KBです。シーケンス、信頼性、および再現性がないことは保証されていません。通常、単一メッセージの送信や信頼性が重要でない場合に使用されます。 3.元のデータグラムソケットは、ネットワークの基盤となる通信プロトコル(IPプロトコルなど)への直接アクセスを提供し、一般のユーザーには提供されず、主に新しいプロトコルの開発や隠された機能の抽出に使用されます。次に、ソケットシステムコールスケジュールは、Unixのソケットシステムコールの簡単な説明です。付録IIIソケットプログラミング方法ここでは、実際の作業では元のデータグラムソケットが使用されるため、接続プロトコル用のバイトフローソケットと非接続プロトコルデータグラムソケットのプログラミング方法を紹介します。以下、議論はしません。ソケットプログラミングに関係なく、クライアント/サーバーコラボレーションモードが採用されます。つまり、クライアントプロセスはサーバープロセスに要求を発行し、サーバープロセスは要求されたタスクを実行し、結果をクライアントプロセスに返します。バイトストリームソケットのサービスプロセスとクライアントプロセスは、通信する前に接続を確立する必要があります。接続と通信を確立する手順を図1に示します。1.サービスプロセスは最初にSocket()を呼び出してバイトストリームソケットを作成し、bind()を呼び出してサーバーアドレスをソケットにバインドし、次にlisten()を呼び出してlistenします。接続要求があると、accept()を呼び出してクライアントプロセスとの接続を確立し、接続要求がない場合はサービスプロセスをブロックします2.クライアントプロセスはSocket()を呼び出してバイトストリームソケットを作成し、connect()を呼び出してクライアントプロセスと接続します。接続要求が到着すると、サービスプロセスが起動され、新しいバイトストリームソケットが生成され、新しいソケットがクライアントプロセスのソケットとの接続を確立するために使用され、サービスプロセスが最初に生成されます。 4.サービスプロセスとクライアントプロセスは、read()とwrite()を呼び出してデータを交換します5.サービスプロセスとクライアントプロセスは、close()を呼び出してソケットを元に戻します。接続を中断してください。図1コネクション型プロトコルのバイトストリームソケットシステム呼び出し図2非接続プロトコルのソケットシステムを呼び出すデータソケットのサービスソケットプロセス通信前にクライアントプロセスが接続を確立する必要がない通信ステップを図2.1に示します。サービスプロセスは最初にSocket()を呼び出してデータソケットを作成し、bind()を呼び出してサーバーアドレスをソケットにバインドし、次にrecvfrom()を呼び出してクライアントプロセスによって送信された要求を待ちます; 2.クライアントプロセスはSocketを呼び出します。 ()データグラムソケットを作成したら、bind()を呼び出してクライアントアドレスをソケットにバインドし、次にsendto()を呼び出して要求をサービスプロセスに送信し、次にrecvfrom()を呼び出してサービスプロセスが要求を返すのを待ちます。結果を処理する3.クライアントプロセスから要求されたタスクを実行した後、サービスプロセスはsendto()を呼び出して処理結果をクライアントプロセスに返します4.サービスプロセスとクライアントプロセスはclose()を呼び出してソケットを取り消します。 IV。ソケットプログラミングの例バイトストリームソケットを使用してTCP /IPネットワーク上でクライアント/サーバーモードのプロセス通信を実装する例を以下に示します。この例では、サービスプロセスはクライアントプロセスの前に実行され、2つのパーティが接続を確立すると、サービスプロセスは接続を介してクライアントプロセスに連続して増加するシーケンス番号を送信します。 '20ポイントを過ぎると、いずれかのプロセスが中断されるまで行が変更されます。 /******server.c******/# include< sys /types.h>#include< sys /socket.h>#include< netinet /in.h>#include< netdb.h>#include< stdio.h> main(){int sock、namelen、seq、netint; struct sockaddr-in server; //サーバーのインターネットアドレスchar msgsock; char buf [1024]; //インターネットドメインを作成するためのTCPプロトコルのバイトストリームソケットは、sock = socket(AF-INET、SOCK-STREAM、IPPROTO-TCP); if(sock< 0){perror(" socket"); exit(1); //ローカルホスト(サーバー)のアドレスを作成されたソケットにバンドルするserver.sinfamily = AF-INET; //インターネットドメインsevrer.sinaddr.s-addr = INADDR-ANY; //任意の有効なアドレスを使用する.sinport = htons(1032); //(bind(sock、& server、sizeof(server))< 0){perror(" bind"); exit(2);} //(長さ5のlistenキューを作成し、ソケットからの接続要求を待ち受けます(listen(sock、5)< 0){perror(" listen"); exit(3))//クライアントへのブロック接続要求が到着し、通信用の新しいソケットが作成されます。namelen = sizeof(server); if((msgsock = accept(sock、& server、& namelen) )< 0){perror( "accept"); exit(4);} //この時点で接続は確立されている、通信seq = 0; for(;;){netint = htonl(seq); //ホストのバイトオーダーはネットワークのバイトオーダーに変換されるwrite(msgsock、& netint、4); //シーケンス番号をクライアントに書き込むseq ++;}} /****** client.c ****** /#include< sys /types.h>#include< sys /socket.h>#include< netinet /in.h>#include< netdb.h>#include< stdio.h> main(argc、 Argv)int argc; char * argv []; {int sock、myseq、recvseq; struct sockaddr-in server; //サーバのインターネットアドレスを保存するstruct hostcnt * h; //ホスト情報を保存する//コマンドラインの後にパラメータを続ける必要があります。 /etc /hostsファイルで定義する必要があるサーバーのホスト名。例://192.7.100.31 hp486if(argc!= 2){printf("使用法:%s servername \\ n"、argv [0] ]; exit(1);} //インターネットドメインのTCPストリームソケットを作成するTCPプロトコルsock = socket(AF-INET、SOCK-STREAM、IPPROTO-TCP); if(sock< 0){perror(" Socket"; exit;(2);} //コマンドライン引数で指定されたサーバーのホスト名に従って、次の場合にサーバーのアドレスを取得します。(!(h = gethostbyname(argv [1]))){perror(argv [1]; ex It(3);} bzero(& server、sizeof(server)); //最初にサーバーアドレスを消去する0server.sinfamily = AF-INET; //インターネットドメイン//サーバーのアドレスにホストのアドレスを入力するBcopy(h - > h - addr、& server.sinaddr、h - > length); server.sinport = htons(1032); //認識されたサービスポート番号を入力し、サービスプロセスとの接続を確立するSock、& server、sizeof(server))< 0){perror(" connect"); exit(4);} //この時点で接続は確立されており、ソケットを読み書きすることによって実装することができる。通信myseq = 0; while(read(sock、& recvseq、4)== 4){//シーケンス番号recvseq = ntohl(recvseq)の読み取り; //(myseq!)の場合、ネットワークバイトオーダーはホストバイトオーダーに変換される= recvseq){printf( "sented =%dが欲しい=%d \\ n"、recvseq、myseq); myseq = recvseq;} elsemyseq ++; if(!(recvseq%50))printf( "); V.結論SocketsはBSD仕様として最初に提案されたものですが、Unix系オペレーティングシステムではTCP /IPとなりました。
<>(recvseq%1000))printf(" \\ n");}}ネットワークプログラミング標準、しかしネットワーク技術の絶え間ない進歩により、Socketsの適用範囲はUnix オペレーティングシステムに制限されなくなりました。
とTCP /IPネットワーク。現在、 Windows
Windows
NT、 Windows
95、OS /2、Sun OS、Netwareおよび他の多くのオペレーティングシステム
が利用可能です。 4.3BSD Unix Socketsをベースとし、独自のオペレーティングシステムの機能にいくつかの拡張を追加したSocketインターフェースこれらの新しいバージョンのSocketsは OSへの組み込みまたはプラグインです。
フォームはプログラマーに提供されます。 W insock( Windows
Sockets)は、 Windows
シリーズのオペレーティングシステム用のSocketsのバージョンです。たとえば、WinsockはTCP /UDPプロトコルだけでなく、IPX /SP X、AppleTalk、Decnet、NetBEUIなどのネットワークプロトコルもサポートしていますNetwareソケットはTCP /UDPをサポートしています。そしてIPX /SPXプロトコル。さらに、ソケットはC言語以外の言語サポート(C ++、BASIC、Pascalなど)を追加しました。ソケットのオープンパフォーマンスは徐々に向上しており、ネットワークプログラミングのための普遍的なインタフェースとなっていると言えるでしょうこの強力なツールを使用して、オペレーティングシステムやクロスネットワークプロトコルにまたがる分散処理システムを構築できます。

Copyright © Windowsの知識 All Rights Reserved