1

好的,所以我一直在尝试自学一些套接字编程。我为自己编写了一个带有异步服务器的小 C# 应用程序,我了解其中的大部分内容,除了以下内容:

所以服务器有一个监听连接的端口,然后当它接收到一个连接时,它会创建一个不同的套接字来进行通信。这就是我不明白的......当理论上客户端不知道为这个新连接选择了哪个端口时,客户端和服务器之间如何进行通信?

感谢您的所有回答

编辑:据我了解,侦听线程在默认端口上侦听,但是所有消息随后都在每个客户端的不同套接字上处理?

再次编辑:你们如何误解我的问题。我了解正常的套接字通信。我的问题是异步服务器的侦听套接字与连接套接字不同。IE。

  1. 服务器侦听默认端口
  2. 客户端尝试连接。
  3. 服务器接收请求。
  4. 然后服务器在客户端和服务器之间创建一个通信套接字并继续侦听默认端口。

我的问题是在最后一步。客户端现在如何知道如何在新套接字上进行通信?这是一些示例代码 http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx

4

4 回答 4

3

尽管这个问题是在一年前发布的,但我相信值得尝试进一步澄清(或混淆?)它。

“客户端现在如何知道如何在新套接字上进行通信?” - 客户端不知道创建了一个新套接字。它只是继续向同一个端口发送数据(数据包)。

但是,这又引出了另一个问题:服务器如何知道哪些数据来自哪个客户端?- 由于 TCP 和 IP 协议,服务器知道客户端的地址和发送数据包的源端口。有了这些信息,服务器可以从多个客户端和多个(客户端)端口接收数据包,并将它们路由到正确的套接字。对于这个问题,将服务器套接字视为过滤器:当从客户端 X - 端口 Y 接收到数据包时,将它们路由到套接字 Z。

“......它现在知道它需要在不同的套接字/端口上进行通信吗?” - 这是一个常见的混淆来源。当在服务器上创建一个新的套接字来接收数据包时(在连接建立之后)它不使用新的端口,它继续使用原来的端口号。服务器端的整个套接字创建过程对客户端是透明的。客户端永远不知道(也不需要知道)创建了一个新套接字来处理它的数据包。

谷歌 TCP 标头以获取更多信息。

希望这可以帮助某人。

于 2012-09-08T09:12:41.943 回答
1

当客户端连接到服务器时,它会选择要连接的端口。客户端还包括一个接收响应的端口。这通常是一个随机选择的端口,但客户端可以覆盖它。

把它想象成一个电话。当你打电话给某人时,有你打电话的电话号码,你也有一个电话号码。即使你们都在互相交谈,但两个电话号码都在使用中。

这不是一个完美的类比,因为电话号码更像是 IP 地址,而中继线不需要在所有情况下都有始发电话号码,但同样的概念也适用。

简单地说,TCP 协议需要一个源端口和目标端口,以及源 IP 地址和目标 IP。在任一方向发送数据包时,都使用适当的 IP/端口。

于 2011-07-08T06:55:22.697 回答
0

实际上,新连接使用相同的端口。服务器在特定端口上侦听传入连接,只要它收到来自客户端的连接请求,服务器就会接受它并创建一个新线程来处理请求。然后继续监听那个端口。

于 2011-07-08T06:20:20.223 回答
0

定义

  • 客户端:连接到服务器的远程机器上的套接字
  • Server:服务器上等待连接的socket
  • ServerClient:与客户端通信的套接字

回答

在接受它之后,我找不到有关如何将ServerClient端口转移到的任何详细信息。但它最有可能在握手中转移。如果您想了解更多信息,请随意阅读 RFC793。ClientServer

我不会详细介绍,但您可以阅读有关被动连接的信息,以获取有关侦听器套接字如何在较低级别工作的更多信息。但基本上侦听器套接字(Server)的目的只是接受套接字(ServerClient)。

使用的端口ServerClient由操作系统中的套接字实现分配,您无法控制。所有你需要知道的是,每个连接ServerClient的人都会得到它自己的端口,并Client在(三路)握手期间被转移到(我认为;)

于 2011-07-08T09:45:30.377 回答