我有GUI应用程序这个应用程序通过调用启动服务器
start_server()
功能。然后创建TCP被动套接字接收服务器循环中的传入连接(我们这里有连接套接字)并同时在多个线程上处理它们。
现在我需要一些强制服务器和所有连接关闭的end_server()函数。关闭此类服务器的最佳做法是什么。
我考虑这样做:
start_server()
函数一些server_info_t
结构。 server_info_t
结构中,有on_server_start
回调,在正确创建服务器之后异步调用,返回有关已创建的服务器的信息,如服务器正在侦听的端口号(这样可以更改{{1像状态图标一样从红色到绿色)GUI controls
info server_loop,在那里来自客户端的新连接即将到来我将获取连接套接字并将其描述符存储在server_info_t结构中一些linked_list_t或hash_map_t的连接套接字。 server_info_t
,并将连接(连接套接字)的处理传递给另一个函数(来自线程池的独立线程),然后服务器循环等待下一个连接。我还需要在此处传递on_client_connected
结构,以从conn套接字描述符 linked_list 中删除connection_socket描述符连接处理给定客户端完成 。 server_info_t
on_client_disconnected
(例如,当用户在 GUI应用程序用户界面中点击停止时),并且神奇发生了......服务器停止了。但是怎么样? 我是否应该使用所有连接套接字(在server_info_t结构中通过链接列表进行迭代)并使用(shutdown + close)关闭它们,然后关闭+关闭被动套接字?
然后我甚至可以调用一些回调end_server(server_info_t)
哪个指针在server_info_t结构中找到。
我是否应该使用一些互斥锁来同步对此server_info_t结构的访问?
答案 0 :(得分:1)
我应该使用一些互斥锁来同步对此server_info_t结构的访问吗?
您肯定应该同步对共享数据结构的访问。
我是否应该使用所有连接套接字(在server_info_t结构中通过链接列表进行迭代)并使用(shutdown + close)关闭它们,然后关闭+关闭被动套接字?
这是一种快速而肮脏的解决方案。更好的设计是告知工作线程应该关闭连接。在这种情况下,您可以:
解决方法"通知"任务可以有所不同:
^http:\/\/(?!m\.xyz\.com|m\.product\.xyz\.com).*\.xyz\.com$
/ au install aurelia-froala-editor
/ select
方法,则可以使用指定的套接字(例如poll
)来表示停止epoll
机制,但它们与系统相关