Поддержка HTTP-сокетов не работает - PullRequest
1 голос
/ 16 ноября 2011

Я пишу браузер, который отправляет запросы HTTP get, построенные так же, как браузеры.Я хочу проверить заголовок "keep-alive", поэтому дважды отправляю и получаю следующий пакет:

"POST /test.php HTTP1.1\r\n"
"Host: 192.168.0.1:8000\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 17\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Accept-Language: en-US,en;q=0.8\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Referer: http://192.168.0.1:8000/test.php\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
"\r\n\r\n"
"para:test_tst_tst"

Однако, когда я получаю второй раз, я получаю ошибку 10054 (ошибка windows).Кажется, сервер отказывается отправлять мне данные.

Что с этим не так?

1 Ответ

1 голос
/ 17 октября 2012

Полагаю, ошибка 10054, о которой вы говорите, это Ошибка Winsock "Сброс соединения по пиру" .

Ваша проблема в том, что у вас есть 3 \r\n пар между заголовком http и телом, а не просто 2

"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
"\r\n\r\n"
"para:test_tst_tst"

Цитирование из спецификации :

generic-message = start-line
                  *(message-header CRLF)
                  CRLF
                  [ message-body ]

Таким образом, сервер будет читать третью пару \r\n как первые 2 байта тела, а затем то, что осталось от 17 байтов длины тела, как указано в заголовке Content-Length. Поэтому вместо того, чтобы начинать с POST, ваш второй запрос будет интерпретироваться как начинающийся с stPOST, что, вероятно, сбивает с толку сервер.

Удалите одну \r\n пару, и все будет в порядке.

Кстати, Keep-Alive - это значение по умолчанию для Connection-Type в HTTP 1.1, поэтому вам даже не нужно указывать это явно.

...