0

TCP ストリームから読み込んでいます - 「MLSD」コマンド (ファイル/ディレクトリ情報の取得) を使用して FTP サーバーにクエリを実行しました。応答サイズは可変であるため(ファイル/ディレクトリなどの量に依存)、「バッファ」を何バイトに設定する必要があるかわかりません。すべてのデータが tcp ストリームを介して FTP サーバーから取得されるようにするにはどうすればよいですか?

 private string controlListener(int controlPort)
        {
            try
            {
                // Create a TcpClient. 
                // Note, for this client to work you need to have a TcpServer  
                // connected to the same address as specified by the server, port 
                // combination.
                controlClient = new TcpClient(ftpHost, controlPort);

                // Get a client stream for reading and writing. 
                controlStream = controlClient.GetStream();

                    // Because we don't know how many bytes are incoming for welcome message - we use a 2 second delay to retrieve all bytes within that time frame.
                    // Receive the TcpServer.response. 
                    // Buffer to store the response bytes.
                    Byte[] data = new Byte[4096];

                    // String to store the response ASCII representation.
                    String responseData = String.Empty;

                    // Get Control Stream Responce: Read the first batch of the TcpServer response bytes.
                    Int32 bytes = controlStream.Read(data, 0, data.Length);
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                    Console.WriteLine(responseData);

                    return responseData;
            }
4

3 に答える 3

4

マークの回答からの続きで...私はこの方法を使用しています。それを組み込む方法を簡単に確認できます。

    /// <summary>
    /// Read TCP response, this simple method can be re-used elsewhere as needed later.
    /// </summary>
    /// <returns></returns>
    private static string ReadResponse(NetworkStream networkStream)
    {
        // Check to see if this NetworkStream is readable.
        if (networkStream.CanRead)
        {
            var myReadBuffer = new byte[256]; // Buffer to store the response bytes.
            var completeMessage = new StringBuilder();

            // Incoming message may be larger than the buffer size.
            do
            {
                var numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                completeMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
            } while (networkStream.DataAvailable);

            return completeMessage.ToString();
        }
        return null;
    }
于 2013-01-30T04:22:29.677 に答える
2

読み取り/受信はループで使用する必要があり、EOF (ゼロ バイト読み取り) または期待したデータ量 (フレーミング API の使用) を取得するまで読み取ります。現在のコードは無効です。483628 バイトが送信されたとしても、Read の 1 回の呼び出しで返されるのは 1 バイトです。

于 2012-12-11T18:55:52.680 に答える
1

私はこれを使用しています...

        public static byte[] readFullStream(Stream st, Int32 BufferSize)
        {
            try
            {
                Monitor.Enter(_lock);
                byte[] buffer = new byte[BufferSize];
                Int32 bytesRead;
                MemoryStream ms = new MemoryStream();
                bool finished = false;
                while (!finished)
                {
                    bytesRead = st.Read(buffer, 0, buffer.Length);
                    if (bytesRead > 0)
                    {
                        ms.Write(buffer, 0, bytesRead);
                    }
                    else
                    {
                        finished = true;
                    }
                }
                return ms.ToArray();
            }
            finally
            {
                Monitor.Exit(_lock);
            }
        }
于 2012-12-11T19:03:38.460 に答える