当前位置: 首页 > 知识库问答 >
问题:

tcp客户端可以使用相同的端口到不同的服务器吗?

韩宏朗
2023-03-14

我想编写一个tcp服务器和客户端html" target="_blank">应用程序,在客户端使用相同端口号的情况下,它们之间有几个不同的连接。

据我所知,服务器有一个侦听器端口,当客户端调用它时,我会在服务器端为这个新连接获得一个新的套接字,当我调用它时

accept();

正当所以在服务器端,我可以识别我与这个新套接字的连接,并通过它发送数据。

现在,我的理解与客户端的问题。我打电话的时候会拿到插座

socket(AF_INET, SOCK_STREAM, 0) 

所以我只有一个插座。在

connect() 

我可以指定远程地址等等。所以当我理解正确时,我可以使用一个套接字连接不同的地址/端口对来创建不同的连接。对吗?

但是,我现在如何在客户机中看到我从哪个逻辑连接接收数据,或者当两个逻辑连接在客户机上使用相同的本地端口时,我如何发送数据?在服务器端,当我调用2个accept时,我有2个套接字,但是客户端呢?对于发送和接收,我只有一个套接字句柄?

或者我必须为客户端上的每个逻辑连接调用套接字()吗?

共有3个答案

席乐童
2023-03-14

我不会谈论特定的编程语言,而是会给出一个适用于所有人的通用答案:

在网络中,你关心的是套接字(IP端口),这应该是唯一的,无论是服务器/客户端套接字还是UDP/TCP套接字。

对于服务器套接字,必须分配一个端口。对于客户端套接字,通常不专门分配端口,但操作系统会自动分配端口。但是,您仍然可以手动将端口分配给客户端套接字(例如,如果某些端口号被防火墙阻止)

服务器进程中:可以获取服务器套接字信息和连接的客户端套接字信息

在客户端进程中:您可以获取客户端套接字信息和服务器(您想要连接到的)套接字信息(当然,您之前应该知道服务器套接字信息,否则您将如何连接到它)。

您可以从客户端套接字发送/接收数据。服务器获得连接的客户端套接字后,可以通过它发送/接收。客户端也可以通过其套接字发送/接收。

穆招
2023-03-14

因此,当我正确理解它时,我可以使用一个套接字与不同的地址/端口对进行多个连接,以创建不同的连接。正当

不能。TCP套接字只能使用一次。当它的连接结束时,或者即使Connect()无法建立连接,如果您想建立新的连接,您必须关闭套接字并创建一个新的。

但是,我现在如何在客户机中看到我从哪个逻辑连接接收数据,或者当两个逻辑连接在客户机上使用相同的本地端口时,我如何发送数据?

每个TCP连接都将为其分配唯一的套接字。跟踪他们是你的责任。

在服务器端,当我调用2个accept时,我有2个套接字,但是客户端呢?

同样的事情也发生在客户端。您需要为每个TCP连接创建并连接一个单独的套接字。因此,每个连接都将有一对新的socket()/connect()调用。

对于发送和接收,我只有一个套接字句柄?

不,每个连接都有一个单独的套接字,就像服务器端一样。

或者我必须为客户端上的每个逻辑连接调用套接字()吗?

是的,还有connect()

刁远
2023-03-14

我可以指定远程地址等等。所以当我理解正确时,我可以使用一个套接字连接不同的地址/端口对来创建不同的连接。对吗?

不是。套接字是IP地址和端口号的组合。

或者我必须为客户端上的每个逻辑连接调用套接字()吗?

>

  • 在我看来,你的困惑出现了,因为你认为例如,某个端口用于SMTP连接,某个端口用于HTTP连接。

    这个端口本身并不能为您定义服务器的套接字。服务器的IP地址正在更改。

    举个例子,考虑下面的场景:

    >

    您的PC-IP1端口50500--Stackoverflow IP2端口80(标准超文本传输协议端口)

    这就是IP1 50500=客户端计算机上的套接字和IP2端口80=Stackoverflow服务器上的目标套接字的组合。

    现在你想连接到gnu。组织:

    您的PC–IP1端口50501–gnu。org IP3端口80(标准http端口)

    组合IP1 50501=客户计算机上的套接字并且IP3端口80=gnu.org服务器上的目的地套接字。

    最好看看Beej的网络编程来了解更多。这是任何使用套接字的人的必读书籍。

  •  类似资料:
    • 我使用python中的套接字设置了一个客户机和一个服务器,客户机向服务器发送数据,服务器执行操作,然后向客户机返回一些数据。最初,客户端和服务器将具有相同的端口号(9999)。我目前的问题是,我必须将服务器端口更改为19999,当我试图运行时,它无法工作。客户端能够发送数据,如果它的端口也更改为19999,但它不工作,如果客户端是9999和服务器是19999,这是我需要的。新的网络系统,所以将感谢

    • 我有一个监听两个不同端口的TCP服务器。我创建了两个不同的套接字,一个在端口8888上,一个在端口6634上。我监听这些端口,然后我在FD_SET中添加两个套接字,并将它们传递给Select()函数...当套接字准备好读取时,我检查FD_ISSET,看看哪个端口上有消息要读取。 不管怎样,当我连接到8888端口时,构思是成功的,我可以向服务器发送和接收。。。当我在客户端ctrl c时,选择函数再次

    • 嗨,我的问题很简单: 我尝试通过TCP连接建立UDP连接(因为多个客户端通过多个通道连接到服务器,我想通过主TCP连接识别相同的客户端) 我通过在客户机上创建TCP和UDP套接字来实现这一点,并通过TCP将操作系统随机分配的本地UDP端口传输到服务器。(在Windows上,我通过getsocketname()获得sendto()之后的端口)。在服务器上,我使用这个端口将UDP数据包发送到这个客户机

    • 另外,两个应用程序不能在一台机器上使用相同的端口,那么当两个不同的服务器具有相同的端口,而一台机器需要通过两个不同的应用程序连接到这两个服务器时会发生什么呢?

    • 我正在开发一个Java客户机/服务器应用程序,它有一套非常具体的规则来说明我必须如何开发它。服务器创建一个实例,该实例具有到客户端套接字的输入和输出流,它们之间的任何输入和输出都由客户端GUI中的事件触发。 我现在添加了服务器端的功能,它将定期向所有连接的客户端发送更新(通过将中创建的每个对象存储在中来完成)。我需要一个等效的客户端机制来处理这些消息,并且被告知这需要在第二个客户端线程中发生,该线