我在 .NET (C#) 中编写了很多“侦听器”,特别是使用 TcpListener 类。当客户端连接时,我已经使用了AcceptTcpClient
和AcceptSocket
方法,到目前为止还没有真正遇到任何问题。
但是,当前的项目围绕着在 .NET 中重新编写一个非常旧的 VB6 应用程序。它使用 Winsock Microsoft 组件。它也是一个 TCP 侦听器,但是我遇到了一些非常奇怪的事情,我不确定如何在 C# 代码中复制。
运行 VB6 应用程序,并使用 Putty 连接到它。我不知道你是否熟悉Putty,但在连接时你可以将其设置为Raw客户端或Telnet客户端。这很重要,因为如果将其设置为 telnet 客户端,则在连接时我在终端中键入一个字符(无回车/换行),DataArrival
Winsock 组件上的事件将触发,我可以使用 GetData 方法读取实际数据。当 Putty 不使用 Telnet 选项,而是设置为原始客户端,并且我连接并键入单个字符时,Winsock 组件的 DataArrival 事件不会触发。在我按下 ENTER 键之前它不会触发,然后触发 DataArrival 事件。
所以现在我有一个 C# 应用程序,使用TcpListener
, 和在 Putty 中,无论它设置为 Raw 还是 Telnet,在实际按下回车键之前,我永远无法获得任何 Read 或 Receive 方法来获取单个字符。
那么谁能告诉我这两者有什么区别?为什么只有当客户端设置为 Telnet 模式时,Winsock 才会在单次按键(无回车/换行)时触发 DataArrival 事件,但 C# 代码在按下回车键之前永远不会获取该数据(回车/换行)。
我确信这与 telnet 选项与 raw 选项的区别有关,但无论我尝试什么,Socket.Receive
orTcpClient.NetworkStream.Read
永远不会选择输入的单个字符,而 Winsock 组件会。
任何人都对我如何在直接的 C# 代码中模拟这种行为有任何想法,或者至少可以解释为什么如果客户端设置为 Raw 或 Telnet,Winsock 组件的行为会有所不同?