Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何绑定到任何可用端口?_Sockets_Networking - Fatal编程技术网

Sockets 如何绑定到任何可用端口?

Sockets 如何绑定到任何可用端口?,sockets,networking,Sockets,Networking,我需要一个应用程序,发送一个UDP数据包到某个网络服务器并接收响应。服务器回复请求来自的相同端口号,因此我首先需要将我的套接字绑定到任何UDP端口号 硬编码UDP端口号是个坏主意,因为它可能会被运行在同一台PC上的任何其他应用程序使用 有没有办法将UDP套接字绑定到任何可用端口?在我看来,这应该是快速获取自由端口#的有效方法,例如accept()函数使用自由端口 如果没有,那么尝试绑定并检查WSAEADDRINUSE/EADDRINUSE状态的最佳策略是什么:从1025或1025+rand()或

我需要一个应用程序,发送一个UDP数据包到某个网络服务器并接收响应。服务器回复请求来自的相同端口号,因此我首先需要将我的套接字绑定到任何UDP端口号

硬编码UDP端口号是个坏主意,因为它可能会被运行在同一台PC上的任何其他应用程序使用

有没有办法将UDP套接字绑定到任何可用端口?在我看来,这应该是快速获取自由端口#的有效方法,例如accept()函数使用自由端口


如果没有,那么尝试绑定并检查WSAEADDRINUSE/EADDRINUSE状态的最佳策略是什么:从1025或1025+rand()或其他位置开始依次尝试端口?

调用而不调用
bind
首先,套接字将自动绑定(到空闲端口)。

我肯定缺少什么,为什么不使用udp套接字发回数据?
从sendto开始,然后使用recvfrom函数读取传入数据,您还可以从中获得发送数据的地址作为奖励,在那里您可以发送回响应。

另一个选项是将端口0指定为
bind()
。这将允许您绑定到一个特定的IP地址(如果您安装了多个),同时仍然绑定到一个随机端口。如果您需要知道选择了哪个端口,可以在执行绑定后使用
getsockname()

accept()用于基于连接的套接字,而不是数据报的套接字。这可能会有帮助:在POSIX中?还需要范围1024+:绑定到端口0是官方记录的绑定到OS分配的随机端口的方法。文档中有:“如果端口指定为零,服务提供商将从动态客户端端口范围为应用程序分配一个唯一的端口。在Windows Vista及更高版本上,动态客户端端口范围的值介于49152和65535之间。这是对Windows Server 2003及更早版本的更改,其中动态客户端端口范围的值介于1025和5000之间。。。应用程序可以在调用bind后使用getsockname来了解已分配给套接字的地址和端口。“@alastair:问题被标记为
Windows
WinSock
,这就是我引用Microsoft文档的原因。顺便说一句,4.2BSD标准中记录了与端口0的绑定,该标准是平台实现的基础。在linux内核中,将端口#=0作为随机分配的请求处理被认为是非常普通的,甚至没有给出规范的参考。(net/ipv4/inet_connection_sock.c,inet_csk_get_port)。@EJP我并不认为这是可行的,只是指出除了Windows和Solaris上的(AFAICT)之外,它并没有记录行为。一些协议要求您关心您使用的端口号。例如,客户端使用它来区分来自同一服务器的多个并发传输。服务器不能只是从同一端口发回,每次文件传输都需要服务器从不同的源端口发送。服务器会按照您所述回复客户端的源地址和端口。在我的特定示例中,每次传输都使用一个新套接字,然后盲目地执行
sendto
将隐式选择一个源端口,但可能还有其他协议,在您实际执行发送到@doug65536之前,您确实关心端口号是什么。这是一个有效的示例,但原始问题没有包含任何关于原因的具体细节。向下投票只是因为正确答案应该是@Remy的(在bind中使用端口0)。@claf implicit bind也是bind,不是吗?在我看来,这两个答案都很有用。@claf你有点不合逻辑。因为topicstarter(绝对是另一个人)的选择,你否决了某人的答案。我同意雷米的答案更好,他得到了应得的选票,但仅仅因为另一个答案更好而否决一个答案是胡说八道。⁺对于不公平的否决票的答案。@Hi Angel:我只是使用投票和否决票来“排序”答案,当我很忙的时候,我通常会阅读被接受的答案,并查找第一个和第二个答案之间的票数差异(如果第二个答案的票数比被接受的票数多,则不值得阅读)。我就是这么用的,所以,至少我对自己不是不合逻辑的。@claf,好吧,至少你告诉了原因。你在这里做得很好。有时会出现这样一个民族,他们只是投了反对票,他们既没有大脑来解释原因,也没有胆小鬼。或者,可能两者兼而有之。你是个好人。