使用TCP在C#中实现FTP客户端

使用TCP在C#中实现FTP客户端,c#,tcp,ftp,stream,networkstream,C#,Tcp,Ftp,Stream,Networkstream,我一直在C#中摆弄TCP套接字,我在与已设置的FTP服务器通信时遇到了一些问题。我可以最初连接并获取220消息,但当我发送“USER nrcrast”命令时,我从未得到响应,DataAvailable属性返回false。有人知道我做错了什么吗?以下是我目前的代码: namespace TCPClient { public partial class TCPClientForm : Form { private TcpClient myClient; NetworkStream

我一直在C#中摆弄TCP套接字,我在与已设置的FTP服务器通信时遇到了一些问题。我可以最初连接并获取220消息,但当我发送“USER nrcrast”命令时,我从未得到响应,DataAvailable属性返回false。有人知道我做错了什么吗?以下是我目前的代码:

namespace TCPClient
{
public partial class TCPClientForm : Form
{


    private TcpClient myClient;
    NetworkStream stream;

    public TCPClientForm()
    {
        InitializeComponent();
        send();

    }

    void send()
    {

        while (true)
        {
            try
            {
                myClient = new TcpClient("nrcrast.dyndns.info", 21);
                break;
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.ToString());
            }

        }
        stream = myClient.GetStream();
        int sendOffset = 0;
        int recOffset=0;

        int dataLength;
        Byte[] receiveData = new Byte[256];


        // wait for a response
        dataLength = stream.Read(receiveData, recOffset, receiveData.Length);
        String recvdMessage = System.Text.Encoding.ASCII.GetString(receiveData, 0, dataLength);
        Console.WriteLine(recvdMessage.ToString());
         recOffset+=dataLength;


        String message = "USER nrcrast";
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
        stream.Write(data, 0, data.Length);
        sendOffset += data.Length;

        // wait for a response
        while (!stream.DataAvailable)
        {
        }
        dataLength = stream.Read(receiveData, 0, receiveData.Length);
        recvdMessage = System.Text.Encoding.ASCII.GetString(receiveData, 0, dataLength);
        Console.WriteLine(recvdMessage.ToString());


    }


}

在黑暗中拍摄时,您需要在命令末尾放置回车和新行

String message = "USER nrcrast\r\n"; 

在黑暗中拍摄时,您需要在命令末尾放置回车和新行

String message = "USER nrcrast\r\n"; 

如果您对类似项目感兴趣(不是说它很完美),我很久以前也做过同样的事情(这是在.NET1.1中,并在添加ssl流时将其移植到.NET2.0)

FTP协议在发送命令的时间、服务器希望您打开数据连接的时间、读取服务器响应的时间等方面存在一些棘手的问题(取决于主动/被动模式)


无论如何,在进行自己的实现时,请随意查看源代码以供参考。这是一个相当完整的实现,并且还可以对ssl/tls进行身份验证。

如果您对类似项目感兴趣(并不是说它很完美),我很久以前也做过同样的事情(这是在.net 1.1中实现的,并在添加ssl流时将其移植到.net 2.0)

FTP协议在发送命令的时间、服务器希望您打开数据连接的时间、读取服务器响应的时间等方面存在一些棘手的问题(取决于主动/被动模式)


无论如何,在进行自己的实现时,请随意查看源代码以供参考。这是一个相当完整的实现,并且还可以对ssl/tls进行身份验证。

我假设您这样做是为了学习,这就是为什么您不使用FtpWebRequest()类的原因,对吗?。。。或者是的。只是想了解协议本身,以便稍后为windows phone编写FTP客户端代码。(我不相信ftpwebrequest可用于windows phone编码)如果您最终需要为Win phone编写自己的代码,那么您可能需要考虑使用/修复,而不是从头开始编写自己的代码。我假设您这样做是作为一种学习练习,这就是为什么您不使用ftpwebrequest()上课,对吗?。。。或者是的。只是想了解协议本身,以便稍后为windows phone编写FTP客户端代码。(我不相信ftpwebrequest可用于windows phone编码)如果您最终需要为Win phone编写自己的代码,那么您可能需要考虑使用/修复,而不是从头开始编写自己的代码。实际上,规范规定命令应以CRLF结尾。因此它将是
“USER nrcrast\r\n”
。见@JimMischel yep!,就是这样,我刚检查过。@nrcrast你应该把答案标记为正确答案,毫不奇怪,请看微软,总是违反所有标准!只是一个评论,请不要生气!实际上,规范规定命令应该以CRLF结尾。因此它将是
“USER nrcrast\r\n”
。见@JimMischel yep!,就是这样,我刚检查过。@nrcrast你应该把答案标记为正确答案,毫不奇怪,请看微软,总是违反所有标准!只是一个评论,请不要生气!