我正在尝试使用套接字来获取一个小的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
。但是,如果我使用相同的代码,其中restOfURL
为/index.html
而baseServer
为www.google.com
,则此工作正常,buf
将包含{{{1}的文本1}}。为什么这不适用于我网站上的文件?
答案 0 :(得分:0)
由于您没有发布完整的代码,我将采取措施并做出假设:
使用"GET %s \r\nHOST:%s \r\n\r\n"
和restOfURL
baseServer
的格式字符串
但是,在sprintf
调用期间,restOfURL未启动,因此您将垃圾数据推送到第一个%s
发布更多代码或确保初始化resOfURL
答案 1 :(得分:0)
正如@Kninnug指出的那样,您需要在请求第一行末尾的HTTP版本字段(例如HTTP/1.1
)。我只想指出在发送请求时不应包含null终止符。也就是说,将send
语句更改为
send(sockfd, request, strlen(request), 0);
此外,最好始终使用snprintf
而不是sprintf
来防止缓冲区溢出,尽管为了确保您仍然需要检查截断。