我一直在弄乱 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 nrcrastrn";
如果你有兴趣在类似的项目上查看某人的肩膀(不是说它完美),我很久以前就做了同样的事情(这是回到.net 1.1中,并在添加SSL流内容时将其移植到.NET 2.0)。
FTP协议在发送命令的时间、服务器期望您打开数据连接的时间、读取服务器响应的时间等时间方面存在一些棘手的部分(取决于主动/被动模式)。
无论如何,请随意查看我的 FTP 客户端库源代码以供参考,因为您可以执行自己的实现。 这是一个非常完整的实现,并且还可以进行身份验证SSL/TLS。