C# 异步套接字概念

Posted

技术标签:

【中文标题】C# 异步套接字概念【英文标题】:C# Async Sockets Concept 【发布时间】:2012-12-17 16:52:48 【问题描述】:

这是我的监听功能和连接功能

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 异步调用,并且您可以使用新创建的套接字与您的远程对等方通信。

为了验证,可以查看listen socket的本地端口和connected socket;他们应该是不同的。

【讨论】:

我同时调试了 2 个不同的客户端,试图连接到同一个服务器,它们都连接到了不同的端口,但是服务器用同一个端口处理它们,我不明白如何 每个套接字(服务器和客户端)都有一个本地端点和一个远程端点。我相信,这些端点可能与您预期的方式不匹配。所以,如果客户端连接到服务器的4000端口,客户端的远程端点端口是4000,但是服务器的本地端点端口可能不是4000。你的意思是这个吗? (另外,客户端的本地端点端口有些随意分配——比我解释得更好的人,但很可能不会是 4000)

以上是关于C# 异步套接字概念的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 应用程序中取消异步发送套接字

相当于 C# 异步套接字中的 Peek?

C#异步套接字服务器没有收到来自Java客户端的响应

UWP C#异步套接字服务器不能接受

绑定时 C# 异步 SocketException

TCP套接字连接中同步与异步的优势