seeker
seeker

Reputation: 3333

TcpClient can't properly send data via stream

I want to send HTTP request using TcpClient. Consider the following code:

        byte[] buf = new byte[1024];
        string header = "GET http://w3.org HTTP/1.1\r\n" +
                        "Host: localhost:2006\r\n" +
                        "Connection: keep-alive\r\n" +
                        "User-Agent: Mozilla/5.0\r\n" +
                        "\r\n";

        var client = new TcpClient();
        client.Connect("w3.org", 80);

        // send request
        var stream = client.GetStream();
        var streamReader = new StreamReader(stream);
        var streamWriter = new StreamWriter(stream);

        client.Client.Send(System.Text.Encoding.ASCII.GetBytes(header));
        //streamWriter.Write(header); - DOES NOT WORK
        stream.Flush();
        // get response

        var response1 = streamReader.ReadLine();

The problem is that when I am trying to send data using Client's Send method - everything works perfectly. When I try to supply data via network stream - the appliaction hangs and no exception was thrown. Could you tell me possible problems?

Upvotes: 2

Views: 1315

Answers (1)

Julien Roncaglia
Julien Roncaglia

Reputation: 17837

The StreamWriter also have an internal buffer and need to be flushed :

byte[] buf = new byte[1024];
string header = "GET http://w3.org HTTP/1.1\r\n" +
                "Host: localhost:2006\r\n" +
                "Connection: keep-alive\r\n" +
                "User-Agent: Mozilla/5.0\r\n" +
                "\r\n";

var client = new TcpClient();
client.Connect("w3.org", 80);

// send request
var stream = client.GetStream();
var streamReader = new StreamReader(stream);
var streamWriter = new StreamWriter(stream);

streamWriter.Write(header);
streamWriter.Flush();
stream.Flush();

// get response
var response1 = streamReader.ReadLine();

Upvotes: 5

Related Questions