C# 套接字.选择并写入

本文关键字:选择 套接字 | 更新日期: 2023-09-27 18:32:43

我正在尝试编写一个可以在一个线程中处理多个客户端的tcp服务器。我真的很想只坚持一个线程,甚至没有隐藏的 C# 异步线程,所以我想使用 Socket.Select 而不是使用异步接收/发送方法。

在阅读Select的文档时,我想知道 select 如何告诉我它可以在不阻塞的情况下发送多少字节。其文档显示:

如果您已经建立了连接,则可写性意味着 所有发送操作都将成功而不会阻塞。

所以根据文档,似乎我可以发出一个巨大的发送操作,它会成功而不会阻塞。但是,如果我输入一个 100 兆字节的发送操作,这将如何工作。当然,套接字的写入缓冲区不能包含那么多数据,因此套接字必须阻止或仅写入一小部分数据。插座在这里做什么?

C# 套接字.选择并写入

假设您使用的是非阻塞套接字Send只会发送它可以缓冲的字节。 它的返回值将是它实际发送的字节数。

直接来自Send的文档:

在非阻止模式下,即使发送,发送也可能成功完成 小于您请求的字节数。这是您的应用程序的 负责跟踪发送的字节数并重试 操作,直到应用程序发送请求数量的 字节。

如果你不想要很多线程,我认为这个项目会有所帮助:http://www.codeproject.com/Articles/488668/Csharp-NET-TCP-Server

作者提出了一个解决方案,该解决方案允许在一个具有 2 个线程的 TCP 服务器套接字上使用多个客户端,而不管连接的客户端数量如何。

希望对您有所帮助!


除非您只想在单个线程中执行所有操作,包括应用程序逻辑,否则...不要这样做:)

有趣的事实:在Android中(从API级别11开始),您无法在主线程中创建具有网络操作的应用程序,因为应用程序在使用NetworkOnMainThreadException启动后会立即崩溃。我认为这表明了情况的严重性;)