レッスン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つのクライアントにプログラムを扱うことができるでしょう。