Ada-使用GNAT.Sockets发送HTTP响应

Ada-使用GNAT.Sockets发送HTTP响应,sockets,http,http-headers,ada,gnat,Sockets,Http,Http Headers,Ada,Gnat,我在ADA中通过套接字发送头时遇到问题。 代码如下: Address.Addr:=地址按主机名获取主机名,1; 地址.端口:=80; 创建_SocketServer; 设置套接字选项服务器,套接字级别,重用地址,True; Bind_SocketServer,地址; 监听SocketServer; 接受_SocketServer、Socket、地址; 通道:=StreamSocket; 接收_SocketSocket、数据、偏移量; 因为我在1。。偏移环 追加请求,字符的ValDataI; 端环

我在ADA中通过套接字发送头时遇到问题。 代码如下:

Address.Addr:=地址按主机名获取主机名,1; 地址.端口:=80; 创建_SocketServer; 设置套接字选项服务器,套接字级别,重用地址,True; Bind_SocketServer,地址; 监听SocketServer; 接受_SocketServer、Socket、地址; 通道:=StreamSocket; 接收_SocketSocket、数据、偏移量; 因为我在1。。偏移环 追加请求,字符的ValDataI; 端环; 字符串的输出通道, HTTP/1.1200OK&CRLF& 日期:2015年1月9日星期五01:08:54 GMT&CRLF&CRLF& 某物 ; 我正在使用Firefox浏览器作为客户端。当我通过套接字读取GET请求时,一切都很好。当我试图发送响应时,问题出现了。在引用代码的最后一行之后,我的浏览器通过Live HTTP头只检查了HTTP/0.9 200 OK,没有显示任何内容,这对我来说有点奇怪,因为我只发送了HTTP/1.1 200 OK


我真的非常感谢你的帮助。提前感谢:

我对Ada不熟悉,但您的代码看起来还是错了

您从套接字读取头文件,并简单地假设完整的头文件在一次读取中。相反,您应该从套接字读取行,直到只使用CRLF获得标题单行的结尾。 你写信给频道,不管这是什么。相反,您需要将请求写入同一个套接字。 我的浏览器只能获得HTTP/0.9 200 OK


您可能只看到浏览器添加的伪标题,因为没有任何有用的内容。实际上,HTTP 0.9(即没有HTTP/0.9)可能是由浏览器造成的,因为它得到的东西没有任何有效的HTTP头。要了解实际情况,请执行数据包捕获。看看Simon Wright的文章,看看这些虚假数据是从哪里来的。

我对Ada不熟悉,但你的代码看起来还是错了

您从套接字读取头文件,并简单地假设完整的头文件在一次读取中。相反,您应该从套接字读取行,直到只使用CRLF获得标题单行的结尾。 你写信给频道,不管这是什么。相反,您需要将请求写入同一个套接字。 我的浏览器只能获得HTTP/0.9 200 OK

您可能只看到浏览器添加的伪标题,因为没有任何有用的内容。实际上,HTTP 0.9(即没有HTTP/0.9)可能是由浏览器造成的,因为它得到的东西没有任何有效的HTTP头。要了解实际情况,请执行数据包捕获。看看Simon Wright的文章,看看这些虚假数据从何而来。

String'Output“将项的值写入流,包括任何边界或鉴别器”

字符串是一种不确定类型,因此您试图输出的字符串确实有边界,您要发送的是字符串的第一个字符作为4字节二进制数的索引,字符串的最后一个字符作为4字节二进制数的索引,然后是字符串

使用String'Write代替,请参见ARM 13.13.2 9。

String'Output“将项的值写入流,包括任何边界或鉴别器”

字符串是一种不确定类型,因此您试图输出的字符串确实有边界,您要发送的是字符串的第一个字符作为4字节二进制数的索引,字符串的最后一个字符作为4字节二进制数的索引,然后是字符串


使用String'Write代替,请参见ARM 13.13.2 9。

Steffen,通道是一个流,其目标实际上是原始套接字。所以这不是问题所在。我的错,我看得不够近。但是,与您的回答一起,这解释了HTTP/0.9-也就是说,浏览器只是将虚假数据解释为HTTP/0.9,因为它们缺少正确的HTTP头。感谢您的回答,我知道我从这个套接字读取的数据目前不是最好的。这只是暂时的解决办法。将字符串“Output”更改为“String”Write使我的浏览器无法获取任何内容。今天晚些时候我将尝试用数据包捕获来检查它。Steffen,通道是一个流,其目标确实是原始套接字。所以这不是问题所在。我的错,我看得不够近。但是,与您的回答一起,这解释了HTTP/0.9-也就是说,浏览器只是将虚假数据解释为HTTP/0.9,因为它们缺少正确的HTTP头。感谢您的回答,我知道我从这个套接字读取的数据目前不是最好的。这只是暂时的解决办法。将字符串“Output”更改为“String”Write使我的浏览器无法获取任何内容。今天晚些时候,我将尝试使用数据包捕获来检查它。最后,我发现我的代码有什么问题。解决办法非常简单。我很尴尬,我在这么长时间后才想到这个。但这是一个很好的教训。你的建议是正确的
我需要使用Write而不是Output。另一件事是,我需要关闭正在写入的套接字。感谢所有支持我的人:我终于知道我的代码有什么问题了。解决办法非常简单。我很尴尬,我在这么长时间后才想到这个。但这是一个很好的教训。你的建议是正确的,我需要使用Write而不是Output。另一件事是,我需要关闭正在写入的套接字。感谢所有对我的支持: