gpt4 book ai didi

sockets - 关闭持久性TCP限制。 (C多线程服务器)

转载 作者:行者123 更新时间:2023-12-03 12:01:34 24 4
gpt4 key购买 nike

我正在设计一个带有线程池的多线程服务器。该系统旨在使用持久性TCP连接,因为客户端将保持接近24/7的连接。我遇到的问题是如何管理关机。当前,连接通过“accept(listen_fd ....)”进入,并被分配给工作单结构。该结构被转储到工作队列中,并被线程拾取。从这一点开始,该线程专用于当前连接。我在线程内的代码是:

/* Function which runs in a thread to handle a request */
void *
handle_req( void *in)
{
ssize_t n;
char read;
/* Convert the input to a workorder_ptr */
workorder_t *workorder_ptr = (workorder_t *)in;

while( !serv_shutdown
&& (n=recv(workorder_ptr->sock_fd,&read,1,0) != 0))
{
printf("Read a character: %c\n",read);
}
printf("Peer has shutdown.\n");

/* Free the workorder memory */
close(workorder_ptr->sock_fd);
free(workorder_ptr);
return NULL;
}

它仅监听套接字并无限期地回显字符,并在客户端终止连接时正确运行。您会在while循环中看到“!serv_shutdown”部分-这是我试图使线程在关闭信号时脱离其循环。当捕获到SIGINT时,全局变量将设置为1。不幸的是,该程序当前正在recv语句上阻塞,并且在读取另一个字符之前不会检查该标志。我想避免这种情况,因为在此连接上发送另一个字符可能要花任意时间。

另外,我在这里的另一篇文章中读到,使用“select”比“accept”等待套接字连接更好,但是我不太理解。您会选择等待,然后在那之后立即接受吗?我不确定select如何创建套接字连接。我问这个问题,因为如果我对select的理解被清除了,也许它适用于我所问的问题?

另外,如何检测连接只是超时的情况?

谢谢!

编辑
经过进一步的研究,我想我可能终于找到了解决方案:

Wake up thread blocked on accept() call

基本上,我可以创建一个全局管道,并让每个线程在自己的socket_fd以及该全局管道上进行选择。然后,当捕获到信号时,我将向管道中写入一些内容。应该唤醒所有线程,不是吗?

最佳答案

好吧,在FreeBSD,MacOSX上,也许还有其他地方,有kevent()调用,它允许监听各种各样的系统事件,包括连接请求以及在数据到达套接字时发出信号。
它将以一种简洁的方式解决您的所有问题,但是它不是便携式的。有诸如libevent和libev之类的库,它们包装了特定于操作系统的功能,例如BSD上的kevent(),Linux上的epoll()等。可能会对您有帮助。

关于sockets - 关闭持久性TCP限制。 (C多线程服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com