2016-01-31 35 views
0

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

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

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

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

+0

'我确实想坚持一个线程,甚至没有隐藏的C#异步线程** ** []没有线程(http:// blog。 stephencleary.com/2013/11/there-is-no-thread.html) – Eser

+0

@Eser:然后简单地忘记我的动机段落,但我仍然对这个问题的答案感兴趣。 – gexicide

回答

1

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

直:

在非阻塞模式下,可以发送成功完成,即使它发出比你要求的字节数 少。应用程序的 责任用于跟踪发送的字节数并重试 操作,直到应用程序发送请求的 字节数。

+0

因此,只有当所有使用的套接字都设置为非阻塞模式时,才使用'Select'才是正确的? – gexicide

+0

'Select'对阻塞套接字可以正常工作,但是它通常不会完成。 – shf301

0

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

作者提出了解决方案,它允许多个客户端在一个TCP服务器套接字2个线程,无论数量连接客户端。

希望它有帮助!


除非你想要做的一切只是在单个线程,包括应用程序逻辑,然后......不这样做:)

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