2011-09-29 9 views
8

Windows 8 Metroアプリケーション用の新しいWinRT (.NET 4.5フレームワークでIRCクライアントを構築しています。WinRT - TCPクライアント?

しかし、いくつか問題があります。 TCPデータを読むためにStreamSocketを使用する必要があることはすでに分かっていますが、何か間違っている可能性があります。

私がこれを信じる理由は、データを受け取っていないからです。

以下、私のコードを参照してください。私はこれに関するWeb上でコードサンプルを見つけることができませんでした。

class IRCClient 
{ 
    private StreamSocket tcpClient; 
    public string Server = "holmes.freenode.net"; 
    public int Port = 6665; 

    public IRCClient() 
    { 
     tcpClient = new StreamSocket(); 
    } 

    public async void Connect() 
    { 
     await tcpClient.ConnectAsync(
         new Windows.Networking.HostName(Server), 
         Port.ToString(), 
         SocketProtectionLevel.PlainSocket); 

     DataReader reader = new DataReader(tcpClient.InputStream); 
     string data = reader.ReadString(reader.UnconsumedBufferLength); 

     MessageDialog dialog = new MessageDialog(data);    
    } 
} 

データは、常にそのコードの後の空の文字列です。さらに、UnconsumedBufferLengthは常に0を返します。

どうしてですか?

+0

ランダム思考;非同期メソッドを試してみましたか?たぶん、彼らは非同期を使用したいですか? –

+1

はい、接続が確立されるまでにはまだ何も受信されません。あなたはInputStreamでReadAsync()を呼び出さなければなりません。 –

+0

申し訳ありませんが、野生のお尻は推測されますが、IRCではマルチキャストUDP接続が必要ですか? – Haspemulator

答えて

9

DataReaderには、ストリームを解釈する前にストリームからバイトを読み取るように指示する必要があります(ReadStringは既に読み取ったバイトを解釈するだけです)。あなたは20バイトの文字列を読みたい場合は

ので、次の操作を行います。

DataReader reader = new DataReader(tcpClient.InputStream); 
await reader.LoadAsync(20); 
string data = reader.ReadString(reader.UnconsumedBufferLength); 

をあなたは 20バイトまでの文字列を読みたい場合は、次の操作を行います。

DataReader reader = new DataReader(tcpClient.InputStream); 
reader.InputStreamOptions = InputStreamOptions.Partial; 
await reader.LoadAsync(20); 
string data = reader.ReadString(reader.UnconsumedBufferLength); 

詳細については、この動画をご覧ください。http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T

DataReaderにはメッセージの境界がありません。これは、ストリームからバイナリデータを待って読み込むより便利な方法です。まだmessage framingが必要です。

+0

また、パーシャルフラグがあるLoadAsyncは、1バイトが使用できるようになるとすぐに戻ることができるので、UnconsumedBufferLengthは文字列の全長よりも短いことがあります。 – chrisvarnz

関連する問題