【Linuxネットワークプログラミング】循環サーバーのTCPモデル


00.目次


文書ディレクトリ

  • 00. ディレクトリ
  • 01. 概要
  • 02. TCPループサーバ実装方法
  • 03. TCP循環サーバーモデル
  • 04. TCP循環サーバー実現
  • 05. 付録
  • 01.概要


    サーバ設計技術は多く,使用するプロトコルによってTCPサーバとUDPサーバがあり,処理方式によって循環サーバと同時サーバがある.
    ループ・サーバと同時サーバ・モデル
    ネットワークプログラムでは、一般的に多くのお客様が1つのサーバ(複数対1)に対応しており、お客様の要求を処理するために、サービス側のプログラムに対して特別な要求を提出しています.
    現在最も一般的なサーバモデル
  • ループ・サーバ:サーバは、同じ時点で1つのクライアントの要求にのみ応答できます.
  • 同時サーバ:サーバは、同じ時点で複数のクライアントの要求に応答することができる.

  • 02.TCP循環サーバーの実現方法


    TCPループサーバは1つのクライアントの接続を受け入れ,その後処理し,そのクライアントのすべての要求を完了した後,接続を切断する.TCPループサーバは一度に1つのクライアントの要求しか処理できず、このクライアントのすべての要求が満たされた後にのみ、サーバは後続の要求を継続することができる.あるクライアントがサーバを占有して放さない場合、他のクライアントは動作しないため、TCPサーバは一般的に循環サーバモデルを使用することは少ない.

    03.TCP循環サーバーモデル

    socket(...);//  
    bind(...);//  
    listen(...);//  
     
    while(1)
    {
    	accept(...);//  
    	process(...);//  , 
    	close(...);//  :accept() 
    }
    

    04.TCP循環サーバー実現

    #include 
    #include 
    #include 						
    #include 
    #include 
    #include 
    #include 
    			
    int main(int argc, char *argv[])
    {
    	unsigned short port = 8080;		//  	
     
    	//  tcp 
    	int sockfd = socket(AF_INET, SOCK_STREAM, 0);   
    	if(sockfd < 0)
    	{
    		perror("socket");
    		exit(-1);
    	}
    	
    	//  
    	struct sockaddr_in my_addr;
    	bzero(&my_addr, sizeof(my_addr));	  //     
    	my_addr.sin_family = AF_INET;		  // IPv4
    	my_addr.sin_port   = htons(port);	  //  
    	my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip
    	
    	//  
    	int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
    	if( err_log != 0)
    	{
    		perror("binding");
    		close(sockfd);		
    		exit(-1);
    	}
    	
    	//  , 
    	err_log = listen(sockfd, 10); 
    	if(err_log != 0)
    	{
    		perror("listen");
    		close(sockfd);		
    		exit(-1);
    	}	
    	
    	printf("listen client @port=%d...
    "
    ,port); while(1) { struct sockaddr_in client_addr; char cli_ip[INET_ADDRSTRLEN] = ""; socklen_t cliaddr_len = sizeof(client_addr); // int connfd; connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); if(connfd < 0) { perror("accept"); continue; } // ip inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN); printf("----------------------------------------------
    "
    ); printf("client ip=%s,port=%d
    "
    , cli_ip,ntohs(client_addr.sin_port)); // char recv_buf[512] = {0}; int len = recv(connfd, recv_buf, sizeof(recv_buf), 0); // , printf("
    recv data:
    "
    ); printf("%s
    "
    ,recv_buf); // send(connfd, recv_buf, len, 0); close(connfd); // printf("client closed!
    "
    ); } close(sockfd); // return 0; }

    05.付録


    【Linux】一歩一歩Linuxネットワークプログラミングチュートリアルのまとめ