第三四半期に - レッスン26 - 同時Serverネットワークの設計

レッスン26 - 同時Serverネットワークの設計

問題の26.1説明

私たちの24級動作の内容で。条件サーバおよびクライアントがあります。しかし、生活の中で、我々は状況より多くのクライアントが発生しました。ターミナル実行./tcp_serverで、実行./tcp_clientプログラムは、他の2つの端末だった、のは、Linuxオペレーティングシステム上でいくつかのシミュレーションをやってみましょう。私たちは、最初のクライアントプログラムは、最初の実行が終了するまで応答した後、別の応答を実行しませんし、2番目に実行されますでしょう。この状況はまた、サイクル・サーバと呼ばれています。このサーバーの処理効率が非常に低いです。

26.2ソリューション

上記の問題を解決するために、我々は、並行処理を同時に処理するために意図され、同時サーバーをご紹介します。この方法は、多くの中で使用することができます(マルチプロセス、マルチスレッド、など)、我々は今日のマルチメソッド・プロセスを採用しています。

プログラミングの同時実行サーバ。我々は、実行段階の手順をコンパイルした過去を見て:接続が確立され、データ処理(4)終了:(1)(2)ソケット(3)ループをバインドするソケットを作成します。問題は、我々はデータ処理を行う際に、処理されていない場合、データは、それが新しい接続を確立する前に待機する必要があります、第三工程で発生します。子プロセスがデータに対処するように、この問題を解決するために、我々は、子プロセスを作成することができ、親プロセスは常に、接続を確立する過程にあることができます。それぞれの子プロセスにそれを与える、接続を確立します。これは、効率を向上させることができます。

tcp_server_fork.c

書式#include <sysの/ socket.h>に

書式#include <stdio.hに>

書式#include <string.hの> //文字列のヘッダー

ヘッダーの#include <netinetの/ in.h> //アドレス

#define portnumを3333

メインint型()

{

         int型の数sockfd;

         int型new_fd;

         チャーバッファー[128]; //定義格納データバイト

         int型のnbyte、受信した文字列の長さ//

         int型sin_size;

         構造体のsockaddr_in SERVER_ADDR。

         構造体のsockaddr_in CLIENT_ADDR。

         PIDのint;

         1 //ソケットを作成します。

         IF((数sockfd =ソケット(AF_INET、SOCK_STREAM、0))== -1)

         {

                  printf( "creatのソケットエラー\ nは!");

                  出口(1)。

         }

         //2.1バインドするアドレスを設定します

         BZERO(&SERVER_ADDR、はsizeof(構造体のsockaddr_in)); //清零

         server_addr.sin_family = AF_INET; //ネットワークプロトコル

         server_addr.sin_port = htons(portnumを); //ポート、二つ以上のバイトが変換されます

         server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //任意のアドレスを示し、二つ以上のバイトを変換します

         //2.2バインドアドレス

         バインド(数sockfd、(sockaddr構造体の*)(&SERVER_ADDR)、はsizeof(sockaddr構造体)); //ポインタがキャストを示し、

         // 3.ポートを聞きます

         (数sockfd、5)聞きます。

         一方、(1)

         {

                  // 4.接続を待っています

                  sin_size =はsizeof(いるsockaddr)。

                  new_fd =受け入れる(数sockfd、(構造体のsockaddr *)(&CLIENT_ADDR)、&sin_size)。

                  printf(「%sのサーバー\ nから接続を取得」、INET_NTOA(client_addr.sin_addr)); //クライアントのIPアドレスを取得し、文字列、整数のアドレスにアドレスを変換し、

                  //子プロセスデータが取り扱う子プロセスを作成します

                  もし(PID =フォーク()== 0)// pidが0子プロセスに等しい場合、親プロセスが0でない子プロセスを作成します

                  {

                           5つの//受信データ

                           nbyte = RECV(new_fd、バッファ、128,0)。

                           バッファ[nbyte] = '\ 0'; //文字列の終端

                           printf( "サーバ受け取っ:%のSの\ n"、バッファ);

                           クローズ(new_fd)。

                           近く(数sockfd)。

                           出口(0);

                  }

                  それ以外の場合(PID <0)

                           printf( "フォークエラー\ nは!");

                  // 6.エンド・コネクション

                  クローズ(new_fd)。

         }

         近く(数sockfd)。

         0を返します。

}

 

tcp_client.cも24回のレッスンをプログラムします。

 

結果:我々は、個別に三つのポートにtcp_server_fork、tcp_client、tcp_clientを有効にすることができます。私たちは、tcp_server_forkプログラムが同時に2つのクライアントにプログラムを扱うことができるでしょう。

おすすめ

転載: www.cnblogs.com/free-1122/p/11357338.html