gpt4 book ai didi

c++ - 在多线程 UDP 服务器中使用多个套接字

转载 作者:行者123 更新时间:2023-11-30 03:49:06 25 4
gpt4 key购买 nike

Requirement: 

我需要编写一个服务器,它应该能够接收多个客户端连接(FCFS 顺序)并能够在单独的线程中处理每个客户端,以便处理看起来好像所有客户端都同时服务。使用的传输协议(protocol)应该是 UDP。客户端和服务器之间还会发生多次数据传输往返,并且从客户端接收到的数据必须存储在服务器端,以便对该客户端进行进一步处理。

Implementation:

为此,我采用了队列/线程池机制。最初我创建了一个固定数量的线程池,并有一个队列数据结构来存储客户端地址。这个队列在所有线程之间共享,因此我使用“mutex”来锁定/解锁这个队列。在主服务器线程中,我创建了一个套接字,将它绑定(bind)到一个全局端口/地址,然后我在“recvfrom”调用上阻塞了服务器。任何想要与服务器通信的客户端都会向监听全局端口地址的主线程服务器发送一条“Hi”消息。主服务器线程在收到这个“Hi”数据报后将客户端的 sockaddr 结构推送到队列中,然后返回阻塞“recvfrom”调用以接受其他客户端。

任何获得队列锁的池线程,弹出客户端地址并开始自行处理该客户端。也就是说,池线程现在将创建一个套接字,将其绑定(bind)到与全局端口不同的端口,并使用它弹出的客户端地址将此端口地址发送到客户端。在客户端,发送“Hi”消息后,它会阻止“recvfrom”调用,一旦它从服务器(使用不同的端口)收到消息,它就会存储这个端口/地址,从那时起,它会与服务器仅使用池服务器线程发送的这个新端口。

Clarification needed:

我注意到在许多 Stack overflow 问题中,在多线程 UDP 服务器中,一个 SINGLE SOCKET 总是足够的,但根据我的要求,我认为我需要多个 UDP 套接字,每个都满足一个客户端。请根据我的要求提供有关线程 UDP 服务器方法的建议

编辑:改进设计

感谢您对我的设计提出的所有评论和讨论。在掌握了您对单套接字连接和上下文切换的所有看法后,我想到了一个改进的设计。请对我的改进设计提供反馈

在此实现中,我将仅使用一个绑定(bind)到全局已知端口地址的全局 UDP 套接字。和以前一样,我最初会创建固定数量的线程,比如 5 个线程。然后我在所有线程的单个套接字上执行 recvfrom()。无论哪个线程先接收到数据报,都可以从该数据报中获知三件事:

  • Client sockaddr(客户端地址)
  • 客户数据(实际发送的数据)
  • 进程号(与数据一起发送。这是为了让服务器知道必须对客户端数据进行什么样的处理)

根据以上信息,服务器线程将根据进程号处理数据,并将回复发送给它收到的同一客户端。在处理数据并发送回复(如有必要)后,该线程将返回阻塞 recvfrom() 调用。

此外,关于各种客户端的详细信息将存储在全局哈希表和映射中(所有线程都可以访问),以便任何线程都可以访问它以根据特定客户端进行处理。

客户端的变化:服务器应该能够知道它必须对客户端数据进行哪些处理。因此,客户端会将进程号与数据一起发送。

最佳答案

一次套接字就足够了,因为每次收到数据包时,您都可以通过使用其源地址 (src_addr) 调用 recvfrom 来识别客户端:

recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);

现在,这个解决方案只有一个接收点。这意味着服务器必须接收数据,然后将其传递给执行该过程的线程。这会降低单套接字解决方案的并行性,因为您只使用一个端口。

<删除>在我看来,你的解决方案在并行性方面更好,因为你的线程在不同的端口上运行,所以它们可以并行服务多个客户端,特别是如果你的机器有多个处理器和几个可用于访问你的客户端的网卡。在最好的情况下,您可能有多个线程在不同的处理器中并行运行,每个线程都为来自不同网络接口(interface)的客户端提供服务。

编辑:

在与 David 讨论了您的设计后,他说服我,拥有多个套接字会导致多次上下文切换,这可能会降低服务器性能。因此,在这种情况下,最好的办法是使用多个线程,但为所有客户端使用一个套接字。

关于c++ - 在多线程 UDP 服务器中使用多个套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32780267/

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