搭建一個後臺服務器--服務端(阻塞)

爲什麼 要在標題後面加個“阻塞”呢,因爲系統爲了增大併發,減小等待(阻塞),建立了另一種事件模式,後文將介紹,這裏只介紹阻塞的模型。

阻塞服務器要乾的事大致可以分爲以下幾步:

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\n" );
                close( sock_server );
                return 0;
        }

開始監聽:

        flag = listen( sock_server, 50 );
        if( flag < 0 )
        {
                printf( "your listen is not ok\n");
                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\n");
		close( sock_server );
		return 0;
	}



接收用戶數據:

	flag = recv( sock_client, buffer, RECV_BUF_LEN, 0 );
	if( flag <= 0 )
	{
		printf( "your recv is no ok\n");
		close( sock_client );
		continue;
	}



校驗數據合法性:

	if( flag != 64 )
	{
		printf( "your recv does follow the protocal\n");
		close( sock_client );
		continue;
	}

	if( buffer[31] || buffer[63] )
	{
		printf( "your recv does follow the protocal\n");
		close( sock_client );
		continue;
	}



發送當前時間 至客戶端:

         current = time(0);
         send( sock_client, ( const char* )¤t, sizeof( time_t), 0 );

關閉客戶連接:

         printf( "your connection is ok\n");
         printf( "now close your connection\n");
         close( sock_client );


這就是一個簡單的服務端處理過程,阻塞模式下受IO的影響,併發量只有2K左右,前篇的客戶端程序的併發量是10000,因此服務端是跟不上的,而且服務端的併發量不受客戶端的進程個數影響,的確很小。

完整代碼在這裏:
下載




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章