HTTP协议如何正常工作?

时间:2010-10-02 05:39:20

标签: http qt sockets header connection

我以为我已经弄明白了,但是现在我正在写一个网络服务器,有些东西不能正常工作。

应用程序在端口上侦听传入请求,当收到请求时,它会读取序列“\ r \ n \ n \ n \ 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 个答案:

答案 0 :(得分:7)

我明白了!

将数据写入套接字后,我必须调用:

pSocket->waitForBytesWritten();

...或者缓冲区没有输出。

答案 1 :(得分:6)

问题可能是你在删除套接字之前没有刷新并关闭套接字吗?

编辑:乔治爱迪生回答了他自己的问题,但很友好地接受了我的回答。这是适合他的代码:

pSocket->waitForBytesWritten();

答案 2 :(得分:0)

尝试使用 telnet nc netcat )进行调试。另外,你有可能发送双重换行符吗?我不确定您的语言,因此如果print添加换行符,请切换到:

  

HTTP / 1.1 200 OK \ r

有一个用于调试套接字协议的小型日志/转发程序也很方便。我不知道任何随便的事情,但是我已经使用了很多年,并且在我需要的时候它是一个救星。

[修改] 尝试使用 wget 来获取文件;使用 -S -O 文件 将输出保存到文件中,看看有什么问题。

[<强>#2

  

pSocket-→写(error_str.toUtf8());

     

删除pSocket;

我很长时间没有使用 Qt ,但在删除之前是否需要刷新或至少关闭套接字?

答案 3 :(得分:0)

你所展示的内容看起来没问题,所以一定是你实际上发送了不同的东西。 (我假设您在浏览器中输入“http://127.0.0.1”。)

下载此产品的crippleware版本并查看其报告内容:

http://www.charlesproxy.com/