C套接字recv:通过对等方重置连接

时间:2013-07-26 16:20:16

标签: c sockets

我正在尝试使用套接字来获取一个小的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.htmlbaseServerwww.google.com,则此工作正常,buf将包含{{{1}的文本1}}。为什么这不适用于我网站上的文件?

2 个答案:

答案 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来防止缓冲区溢出,尽管为了确保您仍然需要检查截断。