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

为什么 要在标题后面加个“阻塞”呢,因为系统为了增大并发,减小等待(阻塞),建立了另一种事件模式,后文将介绍,这里只介绍阻塞的模型。

阻塞服务器要干的事大致可以分为以下几步:

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,因此服务端是跟不上的,而且服务端的并发量不受客户端的进程个数影响,的确很小。

完整代码在这里:
下载




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值