C#Socket.Select and writes

时间:2016-01-31 21:08:40

标签: c# sockets

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

在阅读Select的文档时,我想知道select如何告诉我它可以在没有阻塞的情况下发送多少字节。它的文件说明:

  

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

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

2 个答案:

答案 0 :(得分:1)

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

直接发送文件:

  

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

答案 1 :(得分:0)

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

作者提供的解决方案允许一个TCP服务器套接字上的多个客户端具有2个线程,无论连接的客户端数量是多少。

希望它有所帮助!

除非你想在单个线程中做所有事情,包括应用程序逻辑,否则......不要这样做:)

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