套接字编程:服务器

本文关键字:服务器 编程 套接字 | 更新日期: 2023-09-27 18:01:27

好的,所以我一直试图教自己一些套接字编程。我自己用异步服务器写了一个小小的c#应用程序,我理解了大部分,除了以下内容:

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

谢谢你的回答

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

再次编辑:你们有些人误解了我的问题。我理解正常的套接字通信。我的问题是一个异步服务器,其中监听套接字与连接套接字不同。Ie。
  1. 服务器监听默认端口
  2. 客户端试图连接。
  3. 服务器接收请求。
  4. 服务器在客户端之间创建一个通信套接字服务器并继续监听

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

套接字编程:服务器

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

"客户端现在如何知道如何在新的套接字上通信?"客户端不知道创建了新的套接字。它只是继续发送数据(数据包)到相同的端口。

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

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

谷歌TCP头获取更多信息。

希望这能帮助到别人。

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

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

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

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

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

定义

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

我找不到任何关于ServerClient端口在Server接受后如何转移到Client的细节。但它很可能是通过握手传递的。如果你想了解更多,请阅读RFC793。

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

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