背景线程上的多线程TCP服务器 - 如何强制关闭主线程

时间:2017-06-07 18:44:30

标签: c multithreading sockets tcp server

我有GUI应用程序这个应用程序通过调用启动服务器 start_server()功能。然后创建TCP被动套接字接收服务器循环中的传入连接(我们这里有连接套接字)并同时在多个线程上处理它们。

现在我需要一些强制服务器和所有连接关闭的end_server()函数。关闭此类服务器的最佳做法是什么。

我考虑这样做:

  1. 传递给start_server()函数一些server_info_t结构。
  2. 然后当创建被动套接字时,它的描述符存储在server_info_t中,还存储了它的绑定端口号
  3. server_info_t结构中,有on_server_start回调,在正确创建服务器之后异步调用,返回有关已创建的服务器的信息,如服务器正在侦听的端口号(这样可以更改{{1像状态图标一样从红色到绿色)
  4. 然后我传递相同的结构GUI controls info server_loop,在那里来自客户端的新连接即将到来我将获取连接套接字并将其描述符存储在server_info_t结构中一些linked_list_t或hash_map_t的连接套接字。
  5. 现在我可以调用一些异步回调,如server_info_t,并将连接(连接套接字)的处理传递给另一个函数(来自线程池的独立线程),然后服务器循环等待下一个连接。我还需要在此处传递on_client_connected结构,以从conn套接字描述符 linked_list 中删除connection_socket描述符连接处理给定客户端完成
  6. 这里的struct server_info里面可以有另一个回调函数server_info_t
  7. 现在在后台运行的这个多线程服务器之外我有一个启动服务器的GUI应用程序,它有指向server_info_t结构的指针,该结构存储有关服务器的所有信息:端口号,被动套接字,实际连接的套接字的linked_list(活动套接字),回调函数指针应该被调用以通知服务器事件等。 所以我想我可以on_client_disconnected(例如,当用户在 GUI应用程序用户界面中点击停止时),并且神奇发生了......服务器停止了。但是怎么样?
  8. 我是否应该使用所有连接套接字(在server_info_t结构中通过链接列表进行迭代)并使用(shutdown + close)关闭它们,然后关闭+关闭被动套接字?

    然后我甚至可以调用一些回调end_server(server_info_t)哪个指针在server_info_t结构中找到。

    我是否应该使用一些互斥锁来同步对此server_info_t结构的访问?

1 个答案:

答案 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机制,但它们与系统相关
  • 如果您的工作线程定期唤醒,您可以使用某种原子旗帜
相关问题