C# Socket编程:服务器

C# Socket编程:服务器,c#,.net,sockets,asyncsocket,serversocket,C#,.net,Sockets,Asyncsocket,Serversocket,好的,我一直在教自己一些套接字编程。我自己编写了一个带有异步服务器的小型C应用程序,我了解其中的大部分内容,除了以下几点: 因此,服务器有一个监听连接的端口,当它接收到一个连接时,它会创建一个不同的套接字来进行通信。这就是我不明白的。。。当理论上客户端不知道为这个新连接选择了什么端口时,客户端和服务器之间的通信是如何发生的 谢谢你的回答 编辑:据我所知,侦听线程在默认端口上侦听,但所有消息随后在每个客户端的不同套接字上处理 再次编辑:你们是如何误解我的问题的。我理解正常的套接字通信。我的问题是异

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

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

谢谢你的回答

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

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

服务器侦听默认端口 客户端属性无法连接。 服务器接收器请求。 然后,服务器在客户端和客户端之间创建一个通信套接字 和服务器并继续侦听 在默认端口上。 我的问题是最后一步。客户机现在如何知道如何在新套接字上通信? 下面是一些示例代码

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

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

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

把它想象成一个电话。当你打电话给某人时,有你的电话号码,你也有一个电话号码。尽管你们两个都在通话,但两个电话号码都在使用中

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


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

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

把它想象成一个电话。当你打电话给某人时,有你的电话号码,你也有一个电话号码。尽管你们两个都在通话,但两个电话号码都在使用中

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

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

定义

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

我找不到有关服务器接受ServerClient端口后如何将其传输到客户端的任何详细信息。但这很可能是在握手时传递的。如果您想了解更多信息,请随时阅读RFC793

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

ServerClient使用的端口由操作系统中的套接字实现分配,您无法控制。您需要知道的是,每个连接的服务器客户端将获得自己的端口,并在我认为的三向握手过程中传输到客户端

定义

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

我找不到有关服务器接受ServerClient端口后如何将其传输到客户端的任何详细信息。但它很可能是在 握手。如果您想了解更多信息,请随时阅读RFC793

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


ServerClient使用的端口由操作系统中的套接字实现分配,您无法控制。您需要知道的是,每个连接的服务器客户端将获得自己的端口,并在我认为的三向握手过程中传输到客户端

虽然这个问题是一年前发布的,但我相信它值得尝试澄清或混淆吗?再多点

客户端现在如何知道如何在新套接字上通信客户端不知道创建了新套接字。它只是继续向同一端口发送数据包

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

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

谷歌TCP头获取更多信息


希望这对某人有所帮助。

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

客户端现在如何知道如何在新套接字上通信客户端不知道创建了新套接字。它只是继续向同一端口发送数据包

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

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

谷歌TCP头获取更多信息


希望这对某人有所帮助。

这不是他的重点。他很困惑,目的端口和源端口是分开的,而这些端口可以是不同的。不,这正是他想要的。他试图教我一些套接字编程,所以他是套接字编程的初学者。这在socket编程中是非常基本的,这不是他的重点。他很困惑,目的端口和源端口是分开的,而这些端口可以是不同的。不,这正是他想要的。他试图教我一些套接字编程,所以他是套接字编程的初学者。这在套接字编程中是非常基本的。侦听线程侦听您指定的端口,并且应该始终侦听该端口。每次它从客户端接收到连接请求时,它都将使用一个新的套接字来处理该连接。每个连接一个套接字。请再次编辑:asyn server与syn server在套接字方面没有太大区别,您称之为正常套接字通信。对于asyn服务器:当服务器接受来自客户机的连接时,它将把套接字提供给另一个线程继续处理。之后,它将使用另一个套接字在同一端口上侦听。这里没有什么要混淆的。我只是检查一下你的链接,看看你的观点:这里的Asyn服务器只意味着它在调用Accept函数时不会阻塞当前线程。请注意,当调用套接字处理程序=listener.endAcceptor;它将返回一个新套接字来处理该连接。那个套接字仍然在那个默认端口上。谢谢你的评论。你说的更多的是我想要的,但不是确切的答案
g我的问题我可能问得很糟,所以我道歉。我明白你说的一切。我不理解的部分是技术细节,当它使用一个新的套接字来处理连接时会发生什么。我的意思是,客户机还不知道新套接字的详细信息,因为它是在服务器上创建的。我现在知道它需要在不同的套接字/端口上通信吗?明白你的意思了。实际上,每个连接包括两个套接字:一个客户端套接字和一个服务器套接字。客户机使用套接字连接到服务器,当服务器接受连接时,客户机可以开始通过其客户机套接字与服务器通信,并且在服务器端,将创建一个新的套接字与该客户机通信。因此,客户端不需要任何新的套接字。侦听线程侦听您指定的端口,并且应该始终侦听该端口。每次它从客户端接收到连接请求时,它都将使用一个新的套接字来处理该连接。每个连接一个套接字。请再次编辑:asyn server与syn server在套接字方面没有太大区别,您称之为正常套接字通信。对于asyn服务器:当服务器接受来自客户机的连接时,它将把套接字提供给另一个线程继续处理。之后,它将使用另一个套接字在同一端口上侦听。这里没有什么要混淆的。我只是检查一下你的链接,看看你的观点:这里的Asyn服务器只意味着它在调用Accept函数时不会阻塞当前线程。请注意,当调用套接字处理程序=listener.endAcceptor;它将返回一个新套接字来处理该连接。那个套接字仍然在那个默认端口上。谢谢你的评论。你说的更多的是我想要的,但并没有完全回答我的问题。我可能问得很糟糕,所以我道歉。我明白你说的一切。我不理解的部分是技术细节,当它使用一个新的套接字来处理连接时会发生什么。我的意思是,客户机还不知道新套接字的详细信息,因为它是在服务器上创建的。我现在知道它需要在不同的套接字/端口上通信吗?明白你的意思了。实际上,每个连接包括两个套接字:一个客户端套接字和一个服务器套接字。客户机使用套接字连接到服务器,当服务器接受连接时,客户机可以开始通过其客户机套接字与服务器通信,并且在服务器端,将创建一个新的套接字与该客户机通信。所以客户端不需要任何新的套接字。