[セットトップ]バックグラウンド・サーバの構築--サービス・エンド(ブロック)


なぜタイトルの後ろに「ブロック」を付けるのか、システムは同時性を増大させ、待機(ブロック)を低減するために別のイベントモードを確立しているため、後述するが、ここではブロックのモデルのみを紹介する.
サーバーをブロックするには、次のステップに大きく分けられます.
1.サービス・エンド・リスニング接続の作成
2.ユーザー接続の生成
3.ユーザ要求の受信
4.ユーザーへの返信送信
ノックプロセスは次のとおりです.
リスニング・アドレスとポートを設定します.
	addr_server.sin_family = AF_INET;
	addr_server.sin_port = htons( port );
	addr_server.sin_addr.s_addr = htonl( INADDR_ANY );

接続の作成とバインド:
        sock_server = socket( AF_INET, SOCK_STREAM, 0 );
        flag = bind( sock_server, ( struct sockaddr* )&addr_server, sizeof( struct sockaddr ) );
        if( flag < 0 )
        {
                printf( "your bind is not ok
" ); close( sock_server ); return 0; }

リスニングの開始:
        flag = listen( sock_server, 50 );
        if( flag < 0 )
        {
                printf( "your listen is not ok
"); close( sock_server ); return 0; }

ユーザー接続を受信して生成するには、次の手順に従います.
	sock_client = accept( sock_server, ( struct sockaddr* )&addr_client, &size );
	if( sock_client <=0 )
	{
		printf( "your accept is no ok
"); close( sock_server ); return 0; }

ユーザーデータの受信:
	flag = recv( sock_client, buffer, RECV_BUF_LEN, 0 );
	if( flag <= 0 )
	{
		printf( "your recv is no ok
"); close( sock_client ); continue; }

データの妥当性の検証:
	if( flag != 64 )
	{
		printf( "your recv does follow the protocal
"); close( sock_client ); continue; } if( buffer[31] || buffer[63] ) { printf( "your recv does follow the protocal
"); close( sock_client ); continue; }

クライアントに現在の時刻を送信:
         current = time(0);
         send( sock_client, ( const char* )¤t, sizeof( time_t), 0 );

お客様の接続を閉じるには、次の手順に従います.
         printf( "your connection is ok
"); printf( "now close your connection
"); close( sock_client );

これは1つの簡単なサービス側の処理過程で、ブロックモードの下でIOの影響を受けて、同時量は2 Kぐらいしかなくて、前編のクライアントプログラムの同時量は10000で、そのためサービス側はついていけないので、その上サービス側の同時量はクライアントのプロセスの個数の影響を受けないで、確かにとても小さいです.
完全なコードはここにあります:ダウンロード