1

私はメトロアプリケーションを作成しようとしていますが、問題があります:StreamSocketは私がやりたいことを実際には実行しません(私は思う)

これは、動作する.Netからの私のコードの抜粋です。

        try
        {
            TCP = new TcpClient(server, port);
            Stream = TCP.GetStream();
            Read = new StreamReader(Stream);
            Write = new StreamWriter(Stream);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error connecting to " + server + ": " + e);
            return;
        }

        // Identify
        Write.WriteLine("LOGIN " + Username);
        Write.Flush();

        while (Connected)
        {
            try
            {
                if ((line = Read.ReadLine()) != null && Connected)

StreamSocketを機能させることができません...入ってくる文字列の長さを知っている必要があり、それがどうなるかわかりません-それは異なります。これを行う方法はありますか?

これは私が持っているものですが、機能しません:

        try
        {
            // Connect to the server (in our case the listener we created in previous step).
            await Socket.ConnectAsync(new HostName("example.com"), "1111");
        }
        catch (Exception exception)
        {
            // If this is an unknown status it means that the error is fatal and retry will likely fail.
            if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
            {
                throw;
            }
        }

        // Create a DataWriter if we did not create one yet. Otherwise use one that is already cached.
        Writer = new DataWriter(Socket.OutputStream);
        Listener = new DataReader(Socket.InputStream);

        Debug.WriteLine(Socket.Information.RemoteAddress.CanonicalName); //Check if IP is correct

        SendRaw("LOGIN " + Nickname);

        string line = "";
        Connected = true;
        while (Connected)
        {
            if (Listener.UnconsumedBufferLength != 0)
            {
                line = Listener.ReadString(Listener.UnconsumedBufferLength);
                Debug.WriteLine(line);
            }
        }
    }

    async public void SendRaw(string str)
    {
        Writer.WriteString(str);

        // Write the locally buffered data to the network.
        try
        {
            await Writer.StoreAsync();
        }
        catch (Exception exception)
        {
            // If this is an unknown status it means that the error if fatal and retry will likely fail.
            if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
            {
                throw;
            }
        }
    }

どんな助けでもいただければ幸いです!

4

1 に答える 1

2

まず最初に:元のコードは、発生するのを待っているDOS攻撃です。可能であれば、すべての文字列の前に長さのプレフィックスを含めるようにプロトコルを変更して、メモリを割り当てる前に文字列の大きさを確認できるようにすることをお勧めします。

2番目に2番目:DataReaderクラスは、それらを解釈する前に、内部バッファーにいくつかのバイトを読み取る必要があります。を呼び出して、このバッファに読み込みますLoadAsync

ただし、任意の長さの文字列を読み取りたい場合は、バッファに読み込んで改行を自分でスキャンし、改行が見つからない場合は必要に応じてバッファのサイズを変更する(または新しいバッファを追加する)必要があります。いくつかの最大サイズ。

アップデート:

InputStreamOptionsに設定Partial; LoadAsync任意の大きなバッファサイズ(1024など)で呼び出すことができます。データを取得したら、を呼び出しますReadString(UnconsumedBufferLength)。これを行うたびに、線の一部、線、または線以上になる場合があります。したがって、ループを介して次回のために最後に部分的な行を保持して、を構築してからstringまでに構築する必要があります。Split\n

于 2012-07-03T09:59:28.270 に答える