我以为我已经弄明白了,但是现在我正在写一个网络服务器,有些东西不能正常工作。
应用程序在端口上侦听传入请求,当收到请求时,它会读取序列“\ 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;
答案 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版本并查看其报告内容: