Заголовок Content-Length
должен указывать размер содержимого.Вы устанавливаете его на общий размер ваших заголовков и содержимого.
Encoding.UTF8.GetByteCount(request1+request3)+23).ToString()
Поскольку контентная часть вашего сообщения просто request3
,сервер терпеливо ждет ByteCount(request1)+23
больше байтов контента, который вы никогда не отправляете.
Попробуйте вместо этого:
"Content-Length: " + Encoding.UTF8.GetByteCount(request3).ToString() + "\r\n"
Другая проблема выглядит как ваш цикл:
do
{
bytes = socket.Receive(dataReceived, dataReceived.Length, 0);
page = page + Encoding.ASCII.GetString(dataReceived, 0, bytes);
}
while (bytes > 0);
Поскольку неблокирующие операции с сокетами всегда возвращаются немедленно, независимо от того, завершены они или нет, вам необходим цикл, который продолжает вызывать Receive()
до тех пор, пока операция фактически не завершится.Здесь, если вызов Receive()
возвращает 0
(что почти наверняка произойдет в первый раз), вы выходите из цикла.
Вы должны по крайней мере изменить его на while (bytes <= 0)
, что даст вам по крайней меренекоторые данные (вероятно, только стоимость первого пакета или около того).В идеале, вы должны продолжать вызывать Receive()
, пока не увидите заголовок Content-Length
в ответе, затем продолжайте вызывать Receive()
до конца заголовков, затем прочитайте Content-Length
больше байтов.
Поскольку выВы используете сокеты, вам действительно нужно заново реализовать протокол HTTP.