使用TCP在C#中实现FTP客户端
我一直在C#中摆弄TCP套接字,我在与已设置的FTP服务器通信时遇到了一些问题。我可以最初连接并获取220消息,但当我发送“USER nrcrast”命令时,我从未得到响应,DataAvailable属性返回false。有人知道我做错了什么吗?以下是我目前的代码:使用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
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你应该把答案标记为正确答案,毫不奇怪,请看微软,总是违反所有标准!只是一个评论,请不要生气!