【问题标题】:Open Source C# socket (TCP + UDP) library [closed]开源 C# 套接字(TCP + UDP)库 [关闭]
【发布时间】:2011-08-19 17:18:13
【问题描述】:

我对 .NET 框架的标准套接字类感到头疼。

谁能推荐一个高效的开源 C# 套接字(TCP + UDP)库来处理套接字消息?

【问题讨论】:

  • 您是否需要特别寻找 CLR 套接字不提供的东西?或者你也只想要源代码?
  • 我也想要源代码。用于处理基于线程的 tcp 或 udp 消息和回复。谢谢!
  • 你头疼什么?你想做什么?通常你会打开一个套接字,然后你将负责发送你想要的任何消息。
  • 嗨。这是很多事情。但是你知道我提到的任何图书馆吗?提前致谢!
  • 我在这里问了同样的问题stackoverflow.com/questions/5785741/… 你可以看到,没有答案,除了很容易自己做。仍在寻找稳定且易于使用的东西。

标签: c# sockets


【解决方案1】:

使用 Kerry Jiang 的 SuperSocket 库或 Akka.NET

  1. SuperSocket nuget 包的下载量超过 10 万次;请注意,2.0+ 适用于 .NET Core,而 1.6 适用于 .NET Framework 4.8 及更低版本
  2. SuperSocket.ClientEngine.Core 的下载量已超过 70 万次
  3. Akka(对于 .NET)有超过 120 万的下载量,并且有一个特殊的 Akka.NET.Test
    • 从某种意义上说,这是作弊,因为它将使用套接字的决定推迟到最后一刻
    • “Akka”最初是一个 Java/Scala 项目,后来成为 .NET
    • 因此,您应该在 Google 上搜索“Akka.NET”,而不仅仅是“Akka”
    • 一般来说,您可能希望使用一些背压解决方案来构建您的网络 IO,您可以使用 Akka Async Streams in C# 8
  4. RSocket 是一个新库 built by ex-Netflix engineer Robert Roeser。
    • 与 Akka Streams 类似,它提供了一种处理背压的方法。

另外,在使用消息队列库而不是套接字库方面:

  1. EasyNetQ nuget 包下载量超过 400 万次
  2. NetMQ nuget 包的下载量已超过 60 万次
  3. ZeroMQ nuget 包的下载量超过 80k
    • 我在一个实际项目中使用过它,它工作正常,但它是一个 C dll 的绑定包装器

【讨论】:

    【解决方案2】:

    NetMQ 非常适合简单的套接字通信。它处理消息的重建和许多杂乱的细节。它适用于消息系统中的消息通信,但它适用于简单的套接字。看看请求-响应。套接字是您经常在框架之上使用框架的领域之一,无论如何,让 NetMQ 处理细节。

    【讨论】:

      【解决方案3】:

      我在这里为基于控制台/win 应用程序的 C# WCF/TCP 套接字服务器/客户端制作了示例应用程序

      https://github.com/evaldsurtans/wcf-sample-server-client

      【讨论】:

        【解决方案4】:

        看看 .NET 中包含的 WCF。

        【讨论】:

          【解决方案5】:

          .NET 框架已经是一个用于处理 tcp 和 udp 的库。它大大简化了基础 winsock api 的过程。所以你想要一个位于图书馆顶部的图书馆吗?也许你会想要另一个图书馆?还有一个在那个之上?

          我的意思是,您可能找不到比 .net 框架已经提供的更简单的东西了。套接字是一个复杂的话题,需要您自己提供大量的实现。

          库通常有用的是实现一些已经建立的协议(如 SMTP 或 FTP),或者甚至可能为您提供更多工具来创建自己的协议。

          【讨论】:

          • @Mystere Man 绝对正确。将 .Net 套接字与您的典型 WINSOCK 程序进行比较,甚至将其与低级 OSI 代码进行比较,我认为您可以看到 .Net 几乎使套接字开发变得容易。 @JoesyXHN 套接字编程是一个非常复杂的话题,不适合内心脆弱的人,没有灵丹妙药可以让它变得更容易。
          • 谢谢。你能推荐我一个示例 TCP 服务器实现吗?你会怎么看这个? switchonthecode.com/tutorials/… 谢谢!
          • @JoesyXHN 这是一个好的开始(您提供的链接)。一旦你了解了基础知识,我建议你看看异步方法。它们是创建可扩展解决方案的关键(尽管您仍然可以通过轮询获得可扩展性,但这要困难得多)。
          • 你能告诉我我应该在那个实现中添加异步方法吗?谢谢!
          • 任何阻塞调用通常都有一个 BeginXXX EndXXX 对应项。因此,在服务器示例中,您可以使用 BeginListen 和 EndListen。对于阅读,您可以执行 BeginRead/EndRead,对于发送,您可以执行 BeginSend/EndSend。它在幕后所做的是启动一个线程并使用 IO 完成端口(在基于 NT 的系统上——所有当前的 Windows 服务器都是基于 NT 的)来确定操作何时完成。然后它调用你的异步处理程序。
          猜你喜欢
          • 2015-12-14
          • 2018-04-03
          • 1970-01-01
          • 2020-04-29
          • 2011-01-26
          • 2014-06-05
          • 2011-02-15
          • 2015-12-07
          • 2021-01-23
          相关资源
          最近更新 更多