C# 如何同步读/写到流?

C# 如何同步读/写到流?,c#,synchronization,telnet,C#,Synchronization,Telnet,您好, 我有C#中的自定义Telnet客户端。我正在使用它与IMAP服务器通信。它的工作原理是只写命令,然后得到响应。测试代码: Telnet tc = new Telnet(); // setup server credentials const string server = "pop.nexlink.net"; const int port = 140; const in

您好, 我有C#中的自定义Telnet客户端。我正在使用它与IMAP服务器通信。它的工作原理是只写命令,然后得到响应。测试代码:

            Telnet tc = new Telnet();
            // setup server credentials
            const string server = "pop.nexlink.net";
            const int port = 140;
            const int timeout = 70;
            // establish server connection
            tc.Setup(server, port, timeout);
            // test initial server response
            Console.WriteLine(tc.output);

            // set-up a few commands to send
            var array = new[] { "USER AppChecker@nexlink.net", "PASS password", "QUIT" };

            // while connected to server
            if (tc.IsConnected)
            {
                foreach (string str in array)
                {
                    // Show command on console
                    Console.WriteLine(str);
                    // Write to Stream
                    tc.WriteLine(str);
                    // Read from Stream
                    tc.Read();
                    // Test the Stream output
                    Console.Write(tc.output);
                }


            }
            // close connection
            tc.Disconnect();
调用上述代码的输出为:

  • 使用者AppChecker@nexlink.net
  • +好的,欢迎使用Atmail POP3服务器-使用登录user@domain.
  • +好,需要密码
  • 传递密码
  • 退出
  • +正常,已登录
  • +好的,再见
  • 这是一个简单的例子,但它显示了一个竞争条件的问题。第6行的输出应出现在第5行之前


    问:如何处理

    过去我已经手动编写了自己的telnet客户端。我处理命令的方式是为每个命令编写一个流,其中包含输入和预期的响应(在您的例子中,是我预期的部分回复+OK)。这将允许我发送命令并等待响应。若未收到响应或响应不匹配,则引发异常


    Telnet可以为每个命令发送许多响应(空白、页面更改、登录流等)。因此,等待您预期的响应是必要的。

    我过去已经手动编写了自己的telnet客户端。我处理命令的方式是为每个命令编写一个流,其中包含输入和预期的响应(在您的例子中,是我预期的部分回复+OK)。这将允许我发送命令并等待响应。若未收到响应或响应不匹配,则引发异常


    Telnet可以为每个命令发送许多响应(空白、页面更改、登录流等)。因此,等待您预期的响应是必要的。

    首先,IMAP邮件服务器不会讲Telnet。Telnet是TCP之上的协议。看见然而,Telnet客户端的优点是,由于Telnet是原始TCP套接字之上的一个非常简单的协议,因此,您可以连接到许多在TCP之上使用文本命令/响应样式协议(POP3、IMAP、SMTP、HTTP等)的服务并与之交互

    最终,您可能应该使用“现成的IMAP客户机”。做一些随机的谷歌搜索让我找到了。我不知道这是否是好的,但它可能会导致你的快速胜利

    然而,如果你想学习如何正确地进行TCP/IP网络,你必须了解双向IO的一些基本原理

    你在这里的经历很正常。TCP套接字上有两个通道。一个用于阅读,一个用于写作。这些通道是独立的,并且可能是缓冲的

    缓冲意味着,仅仅因为您在客户端代码中向发送套接字写入了一些数据(一行或任何内容),并不意味着它已在另一端被接收

    因此,在写入之后立即阻塞读取可能意味着您的命令永远不会被发送,您将永远阻塞读取

    此外,您可以以操作系统和带宽允许的速度将命令写入发送套接字。只要服务器开始处理回复,回复就会返回。可能很快,也可能永远不会。socket编程本质上是异步的,并且容易失败(毕竟,您是在通过不可靠的网络处理远程系统)

    处理异步双向IO的常用方法是使用两个线程。一个用于阅读,另一个用于写作。当你必须在两个线程之间协调请求和响应的“聊天”时,“乐趣”就开始了。线程原语,如AutoResetEvent和ManualResetEvent,在这里会有所帮助。尽管你可能会尽最大的努力去看这些,因为它们可以使工作简单得多

    总的来说,我建议。即使对于SMTP和POP3这样的“简单”协议,编写良好的无错误网络代码也是非常重要的


    如果您不想在解决方案中使用C#,而只是想自动化一些简单的Telnet风格的服务交互,那么您应该看看Linux/Unix实用程序,它可以为您节省大量时间。

    首先,IMAP邮件服务器不讲Telnet。Telnet是TCP之上的协议。看见然而,Telnet客户端的优点是,由于Telnet是原始TCP套接字之上的一个非常简单的协议,因此,您可以连接到许多在TCP之上使用文本命令/响应样式协议(POP3、IMAP、SMTP、HTTP等)的服务并与之交互

    最终,您可能应该使用“现成的IMAP客户机”。做一些随机的谷歌搜索让我找到了。我不知道这是否是好的,但它可能会导致你的快速胜利

    然而,如果你想学习如何正确地进行TCP/IP网络,你必须了解双向IO的一些基本原理

    你在这里的经历很正常。TCP套接字上有两个通道。一个用于阅读,一个用于写作。这些通道是独立的,并且可能是缓冲的

    缓冲意味着,仅仅因为您在客户端代码中向发送套接字写入了一些数据(一行或任何内容),并不意味着它已在另一端被接收

    因此,在写入之后立即阻塞读取可能意味着您的命令永远不会被发送,您将永远阻塞读取

    此外,您可以以操作系统和带宽允许的速度将命令写入发送套接字。只要服务器开始处理回复,回复就会返回。可能很快,也可能永远不会。socket编程本质上是异步的,并且容易失败(毕竟,您是在通过不可靠的网络处理远程系统)

    处理异步双向IO的常用方法是使用两个线程。一个用于阅读,另一个用于写作。当你必须在两个线程之间协调请求和响应的“聊天”时,“乐趣”就开始了。线程原语,如AutoResetEvent和ManualResetEvent,在这里会有所帮助。尽管你可能会尽最大的努力去看这些,因为它们可以使工作简单得多

    总的来说,我会的