搭建一个后台服务器--服务端(阻塞)-程序员宅基地

技术标签: 并发  搭建  阻塞  大并发服务器开发  服务器  开发  服务器开发  

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

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

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

完整代码在这里:
下载




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaofei_hah0000/article/details/8742997

智能推荐

JavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer-程序员宅基地

JavaServer Faces 2.2 can not be installed : One or more constraints have not been satisfiedJavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer修改jst.web=2.4,jst.jsf=2.0org.eclipse

【VMCloud云平台】SCOM配置(额外篇)-应用可用性150点实时性测试-程序员宅基地

这一章主要是为了做应用可用性测试而特设的一篇,也是SCOM基础篇的最后一篇,涉及到的服务器如下: 1. 先看看微软提供的可用性监控方面的建议,可以看到每个监控点的URL数量微软建议为50个URLs: 2. 下面介绍测试方案: a) 测试目的: 主要看在150个URLs下应用可用性是否能够实时保障。 b) 计算机规划表: ...

搭建jdk+eclipse+meaven+comcat开发环境(一)-程序员宅基地

首先下载并安装这几个开发工具首先我们我们安装jdk,然后配置它jdk安装只要点下一步即可,不过要记得自己的安装路径。然后我们来配置它:--------》-------》------》将这几个整完后(没有的新建,有的后面直接加,以;分开)我们查一下jdk是否配置成功:运行输入:java -version出现以上信息即可。然后我们配置meaven,meave...

python 笔记:h5py_python h5py_UQI-LIUWJ的博客-程序员宅基地

0 h5py文件一个h5py文件是 “dataset” 和 “group” 二合一的容器。1. dataset ——> 可以类比成ndarray,包含了一些数据2. group ——>可以类比成字典,包含了其它 dataset 和 其它 group我们可以把h5py文件类比成“文件夹”,以树形结构存储group和dataset1 创建一个h5py文件import h5pyimport numpy as np#创建一个h5py文件f = h5py.File(._python h5py

如何在不使用第三变量的情况下交换两个变量的值_如何在不使用第三个变量的情况下_优秀齐子豆的博客-程序员宅基地

如何使两个变量在不使用其他变量的情况下原地交换数据平常我们交换两个变量的数值常常都会使用一个temp变量作为中间变量来进行数据交换举个栗子:temp=a;a=b;b=temp;但如果不能使用其他变量的情况下该怎么交换呢?方法一 加减法 int a=5; int b=10;//方法一 加减法 a=a+b; b=a-b; a=a-b; System.out.println("a="+a+" b="+b_如何在不使用第三个变量的情况下

APPCAN + wampserver 实现简单的个人登录功能_wampserver制作登录界面-程序员宅基地

开发背景:Appcan + wampserver,其中wampserver主要用于提供本地服务器和数据库。这是软件开发工程这门课中的一个大作业,需要实现:1)首页(index.html),首页包含:滚动图片,新闻列表和导航栏,首页内容通过Request模块从服务端获取数据显示;2 ) 登录页面(login.html),实现用户登录,根据学号和密码;(用户未登录时显示)3 ) 用户信..._wampserver制作登录界面

随便推点

String,StringBuffer,StringBuilder三者区别-程序员宅基地

String,StringBuffer以及StringBuilder三者的区别主要是在两个方面,即运行速度和线程安全这两方面。运行速度 从快到慢顺序: StringBuilder &gt; StringBuffer &gt; String String最慢的原因; String为字符串常量,而StringBuffer和StringBuilder均为字符串变量,即String对象一旦创...

vue对文件夹进行拖拽上传完整流程(文件夹中超出100个文件)_vue 上传文件夹_ccc陈陈陈的博客-程序员宅基地

vue对文件夹进行拖拽上传完整流程(文件夹中超出100个文件)_vue 上传文件夹

Android程序基础开发步骤,以简单的App开发为例_安卓程序开发-程序员宅基地

文章目录1、建立开发环境2、新建工程3、开发App4、运行App5、出现问题1、建立开发环境IDE+SDK2、新建工程选择Phone and Tablet日的Empty Activity模板,点击Next使用AS向导建立Hello World工程3、开发App打开layout xml文件,查看Design界面点击右上角code更改文本框内容:新建strings.xml中的字符资源;更改文本框内容:在Design界面选中文本框,在属性页修改text_安卓程序开发

Lite Git (V) - Remote_litgit remote_Ryan ZHENG的博客-程序员宅基地

Lite Git (V) - Remote前言本专栏名为Lite Git。主要想与Pro Git对应,后者为Git官方指南,有兴趣,或者想了解更多细节的同学,请移步官网下载PDF版。本专栏主要为了让初出茅庐的同学更快、更合理地掌握Git的基本运用;同时,本专栏也会介绍一下作为Android开发人员关心的:repo的运用;本篇是该专栏的第五篇,主要介绍Git的远端与本地的概念,属于比较重要的一节,刚开始了解Git的同学强烈建议了解一下;远端(Remote)仓库何为远端仓库?顾名思义,是相对于本_litgit remote

show函数的作用是什么python_Python 的show()方法问题-程序员宅基地

我用Qt建一个button做了以后事件响应,QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.newform),想通过newform方法打开一个我做的计算器新窗口。defnewfo...我用Qt 建一个button做了以后事件响应,QtCore.QObject.connect(self.pushButton..._show方法的作用

Plotly模块的简单使用(模拟掷骰子)_金雾男孩的博客-程序员宅基地

先创建一个Die类from random import randint#编写一个骰子的类#里面有一个属性,默认骰子是6面的#制定一个方法roll会随机生成1-6任意一个数class Die: def __init__(self, side_nums=6): self.side_nums = side_nums...