2012-12-17 77 views
1

这是我的听力功能和连接功能C#异步套接字概念

Socket Listen 

public void Listen(){ 
IPEndPoint ep = new IPEndPoint(IPAddress.Any, PortNumber); 
Listen.Bind(ep); 
Listen.Listen(10); 
Listen.BeginAccept(new AsyncCallback(NewConnection), null);} 

public void NewConnection(IAsyncResult asyn) 
{ 
    Socket Accepted = Listen.EndAccept(asyn); 
    Listen.BeginAccept(new AsyncCallback(NewConnection), null); 
    SomeFunction(Accepted); 
} 

代码工作正常,没有任何问题 - 我跟踪代码,看看如何与不同的客户工作,我理解的流程。但是,我不明白1套接字如何为不同的客户端提供服务。 它通过套接字在客户端之间复用吗?

我在MSDN上读到Accepted在我的代码中只能用于已建立的连接,不能再继续使用 - 那部分我不明白。客户端尝试连接到服务器套接字时实际发生了什么? EndAccept是否返回一个完全不同的套接字与不同的端口建立连接,并保持同一个套接字监听同时接受更多的请求?

回答

1

基于我的理解,你所说的基本上是正确的。 Accepted插座与Listen不一样。在EndAccept之后,您可以使用侦听套接字启动另一个BeginAccept异步调用,并且可以使用新创建的套接字与远程对等方进行通信。

要验证,您可以检查侦听套接字的本地端口和连接的套接字;他们应该是不同的。

+0

谢谢我会试试你说的 –

+0

我调试2个不同的客户端,同时试图连接到同一台服务器,他们都连接到不同的端口,但服务器处理它们都有相同的端口,我不明白如何 –

+0

每个套接字(服务器和客户端)都有一个本地端点和一个远程端点。我相信,这些端点可能与您预期的方式不匹配。因此,如果客户端在端口4000上连接到服务器,则客户端的远程端点端口为4000,但服务器的本地端点端口可能不是4000.这是您的意思吗? (此外,客户端的本地端点端口有点随意分配 - 某人理解得比我能解释得更好,但最有可能不会是4000) – mztan