我有一个用 C 语言编写的单线程服务器,它接受基于 EPOLL 的 TCP/UDP 连接,并支持我们需要支持的众多协议层的插件。那一点没问题。
由于单线程的性质,我想实现一个数据库层,它可以利用相同的 EPOLL 架构,而不是单独迭代所有打开的连接。
我们使用 MariaDB 和在其 API 中支持非阻塞功能的 MariaDB 连接器。
https://mariadb.com/kb/en/mariadb/using-the-non-blocking-library/
但是我发现的不是我所期望的,我所期望的如下所述。
首先我触发mysql_real_connect_start()
,如果它返回零,我们立即发送查询,因为这表明不需要阻塞,尽管这从未发生过。
否则,我获取似乎是即时的文件描述符并将其注册到 EPOLL 并返回到主 EPOLL 循环等待事件。
s = mysql_get_socket(mysql);
if(s > 0)
{
brt_socket_set_fds(endpoint, s);
struct epoll_event event;
event.data.fd = s;
event.events = EPOLLRDHUP | EPOLLIN | EPOLLET | EPOLLOUT;
s = epoll_ctl(efd, EPOLL_CTL_ADD, s, &event);
if (s == -1) {
syslog(LOG_ERR, "brd_db : epoll error.");
// handle error.
}
...
所以,过了一段时间,我确实得到了 EPOLLOUT,表明套接字已经打开。
我尽职尽责地调用 mysql_real_connect_cont() 但在这个阶段它仍然返回一个非零值,表明我必须等待更长时间?
但那是我得到的最后一个 EPOLL 事件,除了 EPOLLRDHUP,我猜 MariaDB 会在 10 秒后挂断。
谁能帮我理解这个想法是否可行?
谢谢...谢谢...非常感谢。