我遇到了在ADA中通过套接字发送标头的问题。 这是代码:
Address.Addr := Addresses(Get_Host_By_Name(Host_Name), 1);
Address.Port := 80;
Create_Socket(Server);
Set_Socket_Option(Server, Socket_Level, (Reuse_Address, True));
Bind_Socket(Server, Address);
Listen_Socket(Server);
Accept_Socket(Server, Socket, Address);
Channel := Stream(Socket);
Receive_Socket(Socket, Data, Offset);
for I in 1 .. Offset loop
Append(Request, Character'Val(Data(I)));
end loop;
String'Output(Channel,
"HTTP/1.1 200 OK" & CRLF &
"Date: Fri, 09 Jan 2015 01:08:54 GMT" & CRLF & CRLF &
"something"
);
我用作Firefox浏览器的客户端。当我通过套接字阅读GET请求时,一切都很棒。当我尝试发送响应时,问题出现了。在引用代码的最后一行之后,我的浏览器只获得HTTP/0.9 200 OK
(通过Live HTTP标头检查)并且根本没有显示任何内容(这对我来说有点奇怪,因为我只是发送HTTP/1.1 200 OK
) 。
真的很感激一点帮助。在此先感谢:)
答案 0 :(得分:6)
String’Output
“将Item的值写入Stream,包括任何边界或判别式”(ARM 13.13.2 (21))。
String
是一个不定类型,所以你试图输出的字符串确实有边界,你发送的是字符串的第一个字符的索引,作为一个4字节的二进制数,将字符串的最后一个字符的索引作为4字节的二进制数,然后是字符串。
改为使用String’Write
(参见ARM 13.13.2(9))。
答案 1 :(得分:1)
我对Ada并不熟悉,但无论如何你的代码看起来都不对。
Socket
读取标题,并简单地假设完整标题位于单个读取内。相反,你应该从套接字读取行,直到你得到标题的结尾(单行只有CRLF)。Channel
,不管这是什么。相反,您需要写入相同的Socket
来自您的请求。我的浏览器只获得HTTP / 0.9 200 OK
您可能只看到浏览器添加的伪标头,因为没有任何用处。实际上HTTP 0.9 has no response header at all(即没有“HTTP / 0.9”),所以这可能是由浏览器组成的,因为它没有任何有效的HTTP头。要查看真正发生的事情,请执行数据包捕获。看看Simon Wright的the answer,看看这个虚假数据的来源。