0

我正在尝试使用套接字来获取一个小的 JSON 测试文件,该文件托管在我的网站 ( http://a-cstudios.com/text.json ) 上。当我这样做时

long numbytes;
char *request = malloc(sizeof(char) * 300);
sprintf(request, "GET %s \r\nHOST:%s \r\n\r\n", restOfURL, baseServer);
// restOfURL = "/text.json" baseServer = "www.a-cstudios.com"
send(sockfd, request, strlen(request) + 1, 0);
char buf[1024];
if ((numbytes = recv(sockfd, buf, 1024-1, 0)) == -1) {
    perror("recv");

}

我明白了recv: connection reset by peer。但是,如果我使用相同的代码 where restOfURLis/index.htmlbaseServeris www.google.com,这工作正常,并且buf将包含index.html. 为什么这不适用于我网站上的文件?

4

2 回答 2

0

由于您没有发布完整的代码,因此我将对其进行尝试并做出假设:

"GET %s \r\nHOST:%s \r\n\r\n"您使用restOfURL和填充格式字符串baseServer

但是,在sprintf调用期间 restOfURL 没有被初始化,所以你将垃圾数据推送到第一个%s

发布更多代码或确保初始化 resOfURL

于 2013-07-26T16:34:32.260 回答
0

正如@Kninnug 指出的那样,您需要HTTP/1.1在请求的第一行末尾添加HTTP 版本字段(例如,)。我只想指出,您在发送请求时不应包含空终止符。也就是说,将send语句更改为

send(sockfd, request, strlen(request), 0);

此外,始终使用snprintf而不是sprintf防止缓冲区溢出是一个很好的做法,尽管为了真正安全,您仍然需要检查截断。

于 2013-07-26T20:39:57.867 回答