一个TCP客户端用于连接服务器的端口是否对其他TCP服务器不可用?

12

使用 socket API 创建 TCP 客户端时,本地主机上的端口用于连接到 TCP 服务器。

所使用的端口似乎无法供另一个 TCP 服务器应用程序绑定并作为服务器运行。

因为用于客户端的端口是动态确定的,它可能是我的应用程序想要用作服务器的端口。

TCP 客户端会动态选择一个可用的端口,防止其他程序在该端口上充当服务器,这是真的吗?

客户端是否能够控制所使用的端口,以确保不占用其他程序需要的端口?


你可以告诉我们你正在使用哪种编程语言,这样我们就可以提供一个示例代码。 - Rafael Colucci
3个回答

8

TCP客户端会动态选择一个端口来使用,以防止其他程序在该端口上成为服务器,这是真的吗?

是的,确实如此。

客户端是否可以控制使用哪个端口,以确保它不占用其他程序所需的端口?

是的,您可以控制,但不应该这样做。使用Bind属性。

好的,事情是这样的:

当您与服务器建立连接时,会打开一个套接字端口,该端口号大于1024。关键是,它将是一个高端口号。

您的服务器不应打开大于1024的TCP端口。基本上,您应该让服务器在低端口上运行。这就是所有http文档告诉我们的。

您还可以检查端口是否已被占用,如果是,则可以在另一个端口上打开服务器套接字。


1
-1:您可以控制端口,实际范围不需要大于5000。例如,Windows XP/2003默认使用1025-5000的范围。 - Erik
是的。当我意识到我忘了那个问题时,我编辑了答案。但是,除非你对可能引起的问题正确,否则不应该这样做。 - Rafael Colucci
1
谢谢。我的错。我试图快速完成,结果没有多想...哈哈 - Rafael Colucci

3
是的,端口将从预定义的范围中选择,在不同的操作系统中会有所不同,并被阻止用于其他用途。如果需要,您可以使用bind选择特定的端口。
编辑:
唯一可能存在多个TCP套接字绑定到相同本地端口/IP的情况是当您从监听套接字accept()新套接字时。您永远不能将TCP套接字bind()到已使用的端口/IP上。关于SO_REUSEADDR也存在一些混淆,这个套接字选项并不允许端口重用,它只是在要绑定到一个端口的时候放松规则,当该端口只有已经超时的连接时才能使用。

-1
如果一个程序绑定了一个端口,我不认为另一个程序也可以使用该端口。通常,较低的端口保留用于某些服务,例如在80端口上的HTTP。如果您想要一个随机端口,您应该生成一个大于1024的端口。有关常用端口的列表,请查看此处:http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers 编辑:已从下面的评论中进行更正。

无论套接字是否正在监听,如果它绑定到一个端口,您就不能将一个新的不相关套接字绑定到同一端口。 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接