tcpClient and IRC client issues

Can someone tell me why the following code isn't working?

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace TCPClient {
    public partial class Form1 : Form {

        private TcpClient client;
        private Thread readThread;
        private NetworkStream stream;
        private Stream dataStream;
        private Encoding dataStreamEncoding;
        private StreamWriter writer;
        private StreamReader reader;

        public Form1() {
            InitializeComponent();

            this.client = new TcpClient();
            this.readThread = new Thread(ReadLoop);
            this.dataStreamEncoding = Encoding.Default;

            Thread.CurrentThread.Name = "MainThread";
            this.readThread.Name = "ReadThread";
        }

        private void btnConnect_Click(object sender, EventArgs e) {
            if (this.client != null && !this.client.Connected) {


                try {
                    this.client.Connect("open.ircnet.net", 6666);

                    if (this.client != null && this.client.Connected) {
                        Console.WriteLine("Connected");
                    }

                    // Set up network I/O objects.
                    this.stream = this.client.GetStream();
                    this.writer = new StreamWriter(this.stream, this.dataStreamEncoding);
                    this.reader = new StreamReader(this.stream, this.dataStreamEncoding);

                    //HandleClientConnected(state.Item3);
                    this.readThread.Start();
                } catch (Exception ex) {
                    Console.WriteLine(ex.Message);
                }
            }
        }

        private void btnPing_Click(object sender, EventArgs e) {
            Console.WriteLine("Ping Sent");
            this.writer.Write("PING");
            this.writer.Flush();
        }

        private void btnLogin_Click(object sender, EventArgs e) {
            Console.WriteLine("Login Info Sent");
            this.writer.Write(  "PASS *\r\n" + 
                                "NICK testing3134\r\n" + 
                                "USER guest 8 * :\"John Doe\"");
            this.writer.Flush();
        }

        private void ReadLoop() {
            try {
                // Read each message from network stream, one per line, until client is disconnected.
                while (this.client != null && this.client.Connected) {
                    var line = this.reader.ReadLine();
                    if (line == null)
                        break;

                    Console.WriteLine(line);
                }

                if(!this.client.Connected) {
                    Console.WriteLine("Disconnected");
                }
            } catch(Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

Console:

Connected
:ircnet.eversible.com 020 * :Please wait while we process your connection to ircnet.eversible.com
Login Info Sent
Ping Sent
The thread 'ReadThread' (0x10bc) has exited with code 0 (0x0).
ERROR :Closing Link: testing3134[unknown@24.255.34.216] (Ping timeout)

Changes that made it work:

Original:

    private void btnPing_Click(object sender, EventArgs e) {
        Console.WriteLine("Ping Sent");
        this.writer.Write("PING");
        this.writer.Flush();
    }

    private void btnLogin_Click(object sender, EventArgs e) {
        Console.WriteLine("Login Info Sent");
        this.writer.Write(  "PASS *\r\n" + 
                            "NICK testing3134\r\n" + 
                            "USER guest 8 * :\"John Doe\"");
        this.writer.Flush();
    }

WORKING:

    private void btnPing_Click(object sender, EventArgs e) {
        Console.WriteLine("Ping Sent");
        this.writer.WriteLine("PING\r\n");
        this.writer.Flush();
    }

    private void btnLogin_Click(object sender, EventArgs e) {
        Console.WriteLine("Login Info Sent");
        this.writer.WriteLine("PASS *\r\n");
        this.writer.Flush();
        this.writer.WriteLine("NICK testing3134\r\n");
        this.writer.Flush();
        this.writer.WriteLine("USER guest 8 * :\"John Doe\"\r\n");
        this.writer.Flush();
    }

Not only did I switch from Write to WriteLine but like the accepted answer suggests I add line returns to the end of all the requests being sent.

Jon Skeet
people
quotationmark

You're not including a line break after the PING or USER messages.

From RFC 2812:

IRC messages are always lines of characters terminated with a CR-LF (Carriage Return - Line Feed) pair

So you should have:

this.writer.Write("PASS *\r\n" + 
                  "NICK testing3134\r\n" + 
                  "USER guest 8 * :\"John Doe\"\r\n");

and:

this.writer.Write("PING\r\n");

I'd also avoid using Encoding.Default if I were you. The RFC specifies that no particular character encoding is used, but it does expect it to be an 8-bit one (rather than potentially multi-byte). This is a poor way of specifying an encoding, but I'd probably use either ASCII or ISO-8859-1 explicitly.

people

See more on this question at Stackoverflow