将40个套接字绑定到40个不同的IP地址

时间:2013-04-12 10:41:54

标签: c windows winapi network-programming udp

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

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

但问题是:

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

  • 服务器bind()到一个众所周知的端口。
  • 客户端将初始数据包发送到该知名端口
  • 服务器从众所周知的端口上的客户端接收第一个数据包。
  • 服务器创建一个带有随机端口的新套接字
  • 服务器从此新套接字回复客户端。
  • 客户收到回复,发现它来自另一个众所周知的端口 服务器端口,并将该端口用作进一步通信的目标。

您将使用getpeername()调用来学习远程地址。

请记住,UDP是无连接的,你需要一些方法来表示你的套接字结束或超时。

答案 2 :(得分:1)

通常的方法是bind一个socketaccept个传入连接。每个连接将通过accept分配一个唯一的套接字。

当您使用UDP时,我只需使用上述TCP,让客户端知道各自的服务器UDP地址。

答案 3 :(得分:1)

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

当收到新数据包时,请使用数据包的远程地址/端口,或在数据包有效负载中添加唯一的clientID,以唯一标识客户端。

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

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