5

我正在写 UDP 服务器/客户端应用程序。

我希望我的单个服务器一次处理 40 个客户端。为此,我想创建 40 个专用线程,每个专用于一个客户端。由于每个客户端有 40 个线程,我也想创建 40 个专用套接字。

但问题是:

我不知道我将绑定()我的套接字的 40 个 IP 地址是什么。(就我现在而言,我必须将绑定()绑定到我的服务器的 IP 地址。)通常我绑定()到"INADDR_ANY"只有一个套接字时。

但是我应该绑定()我的 40 个套接字中的每一个的 IP 地址应该是什么?请帮我。任何评论/帮助表示赞赏。

4

4 回答 4

2

使用 UDP 执行此操作的一种常见方法是:

  • 服务器 bind() 到一个众所周知的端口。
  • 客户端将初始数据包发送到那个众所周知的端口
  • 服务器在众所周知的端口上接收来自客户端的第一个数据包。
  • 服务器创建一个带有随机端口的新套接字
  • 服务器从这个新套接字回复客户端。
  • 客户端收到回复,注意到它来自另一个端口而不是众所周知的服务器端口,并使用该端口作为进一步通信的目的地。

您将使用 getpeername() 调用来了解远程地址。

请记住,UDP 是无连接的,您需要某种方式来发出结束信号或使套接字超时。

于 2013-04-12T11:27:22.603 回答
2

bind只需要本地地址,不需要远程地址。

如果您想为每个客户端使用一个套接字,那么您需要为每个客户端使用不同的端口(使用bind)。这样,每个客户端都可以将其流量发送到专用端口,并且您可以为每个套接字/端口拥有一个线程。

不过,只有一个套接字(和一个端口)可能是一个更好的主意,并且在代码中具有逻辑以根据远程地址(使用recvfrom例如检索)将流量分配给线程。

于 2013-04-12T11:07:36.293 回答
1

通常的方法是绑定单个套接字接受传入的连接。每个连接都将被接受分配一个唯一的套接字。

当您使用 UDP 时,我会简单地使用上面描述的 TCP 让客户端知道他们各自的服务器 UDP 地址。

于 2013-04-12T10:45:14.617 回答
1

在专用侦听线程中创建单个侦听套接字。

当它接收到一个新的数据包时,使用数据包的远程地址/端口,或者在数据包负载中放置一个唯一的客户端ID,以唯一标识客户端。

如果该客户端尚不存在,则为该客户端创建一个新线程,将数据包传递给该线程以进行进一步处理,然后返回侦听。

如果给定的客户端线程有一段时间没有收到任何数据包,它可以自行终止。

于 2013-04-12T22:22:03.427 回答