3、搭建一个后台服务器--服务端(阻塞)

来源:互联网 发布:网络校准时间 编辑:程序博客网 时间:2024/05/16 08:52

为什么要在标题后面加个“阻塞”呢,因为系统为了增大并发,减小等待(阻塞),建立了另一种事件模式,后文将介绍,这里只介绍阻塞的模型。
阻塞服务器要干的事大致可以分为以下几步:
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,因此服务端是跟不上的,而且服务端的并发量不受客户端的进程个数影响,的确很小。
完整代码在这里:
服务器(阻塞)

转载自http://blog.csdn.net/xiaofei_hah0000/article/details/8742997

0 0