我需要一个应用程序将UDP数据包发送到某个网络服务器并接收响应。服务器回复请求来自的相同端口号,所以我首先需要将我的套接字绑定到任何UDP端口号。
对UDP端口号进行硬编码是一个坏主意,因为它可能被同一台PC上运行的任何其他应用程序使用。
有没有办法将UDP套接字绑定到任何可用的端口? IMO应该是快速获得自由端口#的有效方式,该端口被例如用于accept()函数。
如果不是,那么尝试绑定并检查WSAEADDRINUSE / EADDRINUSE状态的最佳策略是什么:从1025或1025 + rand()或其他一些开始依次尝试端口?
答案 0 :(得分:205)
另一种选择是将端口0指定为bind()
。这将允许您绑定到特定的IP地址(如果您已经安装多个),同时仍然绑定到随机端口。如果您需要知道选择了哪个端口,则可以在执行绑定后使用getsockname()
。
答案 1 :(得分:36)
首先调用sendto
而不调用bind
,套接字将自动绑定(到一个空闲端口)。
答案 2 :(得分:0)
我必须遗漏一些东西,为什么不使用udp套接字发回数据? 从sendto开始,然后使用recvfrom函数读取传入的数据,您还可以获得发送数据的地址作为奖励,然后在那里发送回复。