【发布时间】:2017-11-09 06:30:55
【问题描述】:
我有 GUI 应用程序,这个应用程序通过调用来启动服务器
start_server() 函数。然后在服务器循环中创建 TCP 被动套接字接收传入连接(我们这里有连接套接字)并同时在多个线程上处理它们。
现在我需要一些 end_server() 函数来强制关闭服务器和所有连接。关闭此类服务器的最佳做法是什么。
我考虑这样做:
- 传递给
start_server()函数一些server_info_t结构。 - 那么当被动套接字创建时,它的描述符 i 存储在 server_info_t 中,也存储了它的绑定端口号
- 在
server_info_t结构中有on_server_start回调,它在服务器被正确创建后被异步调用,返回一些关于创建的服务器的信息,比如服务器正在侦听的端口号(这可以改变GUI controls,比如状态图标从红到绿) - 然后我传递相同的结构
server_info_tinfo server_loop,在那里,来自客户端的新连接即将到来,我将使用连接套接字并将其描述符存储在 server_info_t 结构中一些linked_list_t 或 hash_map_t 的连接套接字。 - 现在我可以调用一些异步回调,如
on_client_connected,并将连接(连接套接字)的处理传递给另一个函数(从线程池中分离线程),然后服务器循环等待下一个连接。我还需要在此处传递server_info_t结构,以从 linked_list 的 conn 套接字描述符中删除 connection_socket 描述符,它为给定的客户端 完成 连接处理。 - struct server_info 里面可以有另一个回调函数
on_client_disconnected - 现在在后台运行的这个多线程服务器之外,我有一个启动服务器的 GUI 应用程序,它具有指向 server_info_t 结构的指针,该结构存储有关服务器的所有信息:端口号、被动套接字、实际连接的连接套接字的linked_list(活动套接字),应调用的回调函数指针以通知服务器事件等。
所以我想我可以创建
end_server(server_info_t)(例如,当用户在GUI 应用程序 用户界面中单击STOP 时),奇迹发生了……服务器停止。但是怎么做?
我是否应该获取所有连接套接字(在迭代 server_info_t 结构中的链表时)并使用 (shutdown + close) 关闭它们,然后关闭 + 关闭被动套接字?
然后我什至可以调用一些回调 on_server_end 我在 server_info_t 结构中找到的指针。
我应该使用一些互斥锁来同步访问这个 server_info_t 结构吗?
【问题讨论】:
-
这是关于 windows 的吗?作为第一个提示,永远不要调用你自己的类型
something_t。_t后缀保留用于在任何 POSIX 环境中(编译器/标准库/...)的实现。 -
它相当 unix。我将在我的 macOS GUI 应用程序以及带有 cygwin 的 Windows 上使用它。
-
你可能应该为每个线程设置一些信号变量来通知线程关闭请求然后等待它(例如
pthread_join()使用 POSIX 线程)。也许您应该澄清平台并显示您的一些代码以获得实际的答案 -
它是 Objective-c 中的 cocoa 应用程序,我尝试用 C 为它编写跨平台的服务器(也可在 Windows 上使用)
标签: c multithreading sockets tcp server