初试TinyWebServer项目所遇到的问题

初试TinyWebServer所遇到的问题

项目地址

按照作者所写的快速运行的步骤,安装了MYSQL,向新database添加了自己的用户名和密码,然后兴高采烈的对项目进行make后,程序却立马结束,然后打印出一条日志信息:

2021-12-15 18:50:37.474898 [erro]: MySQL Error

看来是MySQL出问题了,但是到底是哪里出了问题呢?而这需要对源代码中CGImysql\sql_connection_pool.cppvoid connection_pool::init函数进行改进,因此我将源代码改进为:

void connection_pool::init(string url, string User, string PassWord, string DBName, int Port, int MaxConn, int close_log)
{
	m_url = url;
	m_Port = Port;
	m_User = User;
	m_PassWord = PassWord;
	m_DatabaseName = DBName;
	m_close_log = close_log;

	for (int i = 0; i < MaxConn; i++)
	{
		MYSQL* con = NULL;
		MYSQL* ret = NULL;

		ret = mysql_init(con);
		if (ret == NULL)
		{
          // 如果mysql_init()返回空,那就打印该信息
			LOG_ERROR("MySQL Error: mysql_init() returns NULL");
			exit(1);
		} else {
			con = ret;
		}

		ret = mysql_real_connect(con, url.c_str(), User.c_str(), PassWord.c_str(), DBName.c_str(), Port, NULL, 0);
		if (ret == NULL)
		{
          // 如果mysql_real_connect()返回空,那就使用mysql_errorh和mysql_errno打印具体的出错信息
			string err_info( mysql_error(con) );
			err_info = (string("MySQL Error[errno=")
				+ std::to_string(mysql_errno(con)) + string("]: ") + err_info);
			LOG_ERROR( err_info.c_str() );
			exit(1);
		} else {
			con = ret;
		}

		connList.push_back(con);
		++m_FreeConn;
	}

	reserve = sem(m_FreeConn);
	m_MaxConn = m_FreeConn;
}

于是我就能直到MYSQL具体是哪里出错了,再次make然后./server运行一遍,得到以下的错误日志信息

2021-12-15 18:50:37.474898 [erro]: MySQL Error[errno=2002]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

于是我便上网查找该错误的原因,最终发现了…是我安装MYSQL时只安装了mysql-server而没有安装mysql-client(艹),这俩是缺一不可的,因此安装MYSQL时请使用以下命令:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mysql-server
sudo apt-get install mysql-client

解决了该问题以后叕重新make运行一次./server,可恶的是又出现了错误日志信息

2021-12-15 19:27:03.291225 [erro]: MySQL Error[errno=1045]: Access denied for user 'myname'@'localhost' (using password: YES)

你可能在安装完mysql后使用它时就会出现该错误,例如在输入mysql -u root -p命令也会出现该错误,然后我在该命令失败后使用sudo mysql -u root -p以root身份运行该命令,竟然成功了,成功后便设置用户的密码、用户名…于是该问题就被延后到了运行时!

而出现这个错误的原因大概就是跟sudo相关,需要root身份之类的(2022年5月12日注:其实可以尝试sudo运行server程序sudo ./server来解决该问题),在上网了解到,这需要我们对MYSQL进行个人配置,那MYSQL的个人配置文件在哪呢?输入以下控制台命令便可以知道(美元符号也是命令的一部分!不是控制台的$!不要忘记!):

$(which mysqld) --verbose --help |grep -A 1 'Default options'

之后便输出三个个人配置文件的路径:
输入命令的结果

然后进入这三个文件之一添加下面这一段,然后保存:

[mysqld]
skip-grant-tables

解决了该问题以后叕重新make运行一次./server,诶成功,查看日志信息,正在有条不紊地运行,起飞~:
成功之后的日志信息
然后打开浏览器在地址栏输入localhost:9006,诶哈哈哈哈哈哈,网页来喽!
在这里插入图片描述


希望我的经历能够帮到你,这玩意儿折腾了我两天,不过也学会了使用vscode用ssh连接到ubuntu虚拟机,一切都是起步,加油!


(2022年5月11日)Reactor模式下imporvtimer_flag标志位的作用

每个http连接有两个标志位:improvtimer_flag,初始时其值为0,它们只在Reactor模式下发挥作用。因为在Reactor模式中,主线程只负责监听读/写事件(得知有读写数据了),线程池中的线程负责IO操作(真正地读/写数据)。但是如果线程池中的子线程进行客户的IO操作时,出现错误了,那子线程该怎么将这个错误通知给主线程呢?因此作者便让子线程将imporvtimer_flag这两个标志位置1来告知主线程:“子线程我呀,对这个客户连接的IO操作,它,出!错!了!,你关闭掉这个客户的连接吧!”,于是主线程就知道要关闭这个IO出错的客户的连接。

所以简而言之,这两个标志位的作用就是:“Reactor模式下,当子线程执行读写任务出错时,来通知主线程关闭子线程的客户连接”。对于improv标志,其作用是保持主线程和子线程的同步;对于time_flag标志,其作用是标识子线程读写任务是否成功。

下面是源代码中这两个标志具体的设置流程:

  • threadpool<T>::run()中的request->read_once()request->write()完成后imporv会被置1,标志着http连接的读写任务已完成(请求已处理完毕);如果http连接的读写任务失败(请求处理出错)timer_flag会被置1。
  • WebServer::dealwith_read()WebServer::dealwith_write()中,会循环等待连接improv被置1,也就是一直等待该http连接的请求处理完毕,如果请求处理失败则关闭该http连接。
  • 30
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
要安装和使用TinyWebServer,请按照以下步骤进行操作: 1. 首先,根据引用中的指示,打开`main.cpp`文件并进行相应的配置修改。 2. 接下来,根据引用中的指示,在Ubuntu 21.10下安装MySQL,并创建一个普通用户并赋予相应的权限。 3. 执行以下命令来编译和运行TinyWebServer: ``` cd Tinywebserver sh ./build.sh ``` 通过以上步骤,你就可以成功安装和使用TinyWebServer了。如果你需要更详细的配置和使用说明,可以参考引用中提供的帖子。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++ 经典服务器开源项目 Tinywebserver的使用与配置(百度智能云服务器安装ubuntu18.04可用公网ip访问)](https://blog.csdn.net/yingLGG/article/details/121400284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [学习TinyWebServer,在Ubuntu-21.10下安装mysql 8.0.27,并创建普通用户,赋予权限](https://blog.csdn.net/weixin_44620044/article/details/121788043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值