Как работает протокол HTTP? - PullRequest
4 голосов
/ 02 октября 2010

Я думал, что все это выяснил, но теперь, когда я пишу веб-сервер, что-то работает не совсем правильно.

Приложение прослушивает порт для входящих запросов, и когда оно получает один, он читает все до последовательности "\ r \ n \ r \ n".(Поскольку это означает конец заголовков - да, я игнорирую возможные данные POST.)

Теперь, после того, как он читает это далеко, он записывает в сокет ответ:

HTTP/1.1 200 OK\r\n
Host: 127.0.0.1\r\n
Content-type: text/html\r\n
Content-length: 6\r\n
\r\n
Hello!

Однако, когда Firefox или Chrome пытаются просмотреть страницу, она не отображается.Chrome сообщает мне:

Ошибка 324 (net :: ERR_EMPTY_RESPONSE): неизвестная ошибка.

Что я делаю не так?


Здесьэто часть кода:

QTcpSocket * pSocket = m_server->nextPendingConnection();

// Loop thru the request until \r\n\r\n is found
while(pSocket->waitForReadyRead())
{
    QByteArray data = pSocket->readAll();

    if(data.contains("\r\n\r\n"))
        break;
}

pSocket->write("HTTP/1.0 200 OK\r\n");

QString error_str = "Hello world!";

pSocket->write("Host: localhost:8081\r\n");
pSocket->write("Content-Type: text/html\r\n");
pSocket->write(tr("Content-Length: %1\r\n").arg(error_str.length()).toUtf8());
pSocket->write("\r\n");
pSocket->write(error_str.toUtf8());

delete pSocket;

Ответы [ 4 ]

7 голосов
/ 02 октября 2010

Я понял это!

После записи данных в сокет я должен позвонить:

pSocket->waitForBytesWritten();

... или буфер не выводится.

6 голосов
/ 02 октября 2010

Может ли быть проблема в том, что вы не очищаете и не закрываете сокет перед удалением?

РЕДАКТИРОВАТЬ: Джордж Эдисон ответил на свой вопрос, но был достаточно любезен, чтобы принять мой ответ,Вот код, который работал для него:

pSocket->waitForBytesWritten();
0 голосов
/ 02 октября 2010

То, что вы показали, выглядит хорошо, так что, должно быть, вы отправляете что-то другое.(Я полагаю, что вы вводите "http://127.0.0.1" в своем браузере.)

Загрузите версию этого продукта в виде программного обеспечения и посмотрите, что он сообщает:

http://www.charlesproxy.com/

0 голосов
/ 02 октября 2010

Попробуйте с помощью telnet или nc ( netcat ) отладить его. Кроме того, возможно, вы отправляете двойные переводы строки? Я не уверен в вашем языке, поэтому, если ваш print добавляет символ новой строки, переключитесь на:

HTTP / 1.1 200 OK \ r

Также удобно иметь небольшую программу регистрации / пересылки для отладки протоколов сокетов. Я не знаю ничего лишнего, но у меня был такой, которым я пользовался много лет, и это спасало меня, когда мне это нужно.

[ Редактировать ] Попробуйте использовать wget для извлечения файла; используйте -S -O file , чтобы сохранить вывод в файл и посмотреть, что не так в этом случае.

[ # 2 ]

pSocket-> записи (error_str.toUtf8 ()); * * тысяча тридцать один

удалить pSocket;

Я давно не пользовался Qt , но нужно ли перед удалением очистить или хотя бы закрыть сокет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...