爲什麼 要在標題後面加個“阻塞”呢,因爲系統爲了增大併發,減小等待(阻塞),建立了另一種事件模式,後文將介紹,這裏只介紹阻塞的模型。
阻塞服務器要乾的事大致可以分爲以下幾步:
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 );
完整代碼在這裏:
下載