Reputation: 15896
I am building an IRC client in the new WinRT (.NET 4.5
) framework for Windows 8 Metro applications.
However, I have some issues. I've already figured out that I need to use a StreamSocket
to read TCP data, but I may be doing something wrong.
The reason I believe this is because I am not receiving any data.
Below you see my code. I haven't been able to find any code samples on the web regarding this.
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);
}
}
Data is always an empty string following that code. Furthermore, UnconsumedBufferLength always returns 0.
How come?
Upvotes: 8
Views: 5752
Reputation: 456857
You need to tell the DataReader
to read bytes from the stream before you interpret them (ReadString
just interprets the bytes already read).
So, if you want to read a string of 20 bytes, do this:
DataReader reader = new DataReader(tcpClient.InputStream);
await reader.LoadAsync(20);
string data = reader.ReadString(reader.UnconsumedBufferLength);
If you want to read a string up to 20 bytes, do this:
DataReader reader = new DataReader(tcpClient.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
await reader.LoadAsync(20);
string data = reader.ReadString(reader.UnconsumedBufferLength);
See this video for more info: http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-580T
Note that DataReader
does not give you message boundaries; it's just a more convenient way of waiting for and reading binary data from a stream. You still need message framing.
Upvotes: 9