Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当没有更多的数据可读取时,如何判断stop recv()是否处于空闲状态?_C_Sockets_Http_Tcp - Fatal编程技术网

当没有更多的数据可读取时,如何判断stop recv()是否处于空闲状态?

当没有更多的数据可读取时,如何判断stop recv()是否处于空闲状态?,c,sockets,http,tcp,C,Sockets,Http,Tcp,实际上,我向某个URL发送GET请求,并使用recv()接收结果。我有一个while循环,它从缓冲区中的recv()获取文件块 void send_GET(int client, char *url) { char buf[BUF_SIZE] = {0}; sprintf(buf, "GET / HTTP/1.1\r\nHost: %s\r\n\r\n", url); send(client, buf, strlen(buf), 0); } int main() {

实际上,我向某个URL发送GET请求,并使用
recv()
接收结果。我有一个while循环,它从缓冲区中的
recv()
获取文件块

void send_GET(int client, char *url) {
    char buf[BUF_SIZE] = {0};
    sprintf(buf, "GET / HTTP/1.1\r\nHost: %s\r\n\r\n", url);
    send(client, buf, strlen(buf), 0);
}

int main() {
    //sock is a socket()
    send_GET(sock, url);

    while ((numbytes = recv(sock, buf, BUF_SIZE - 1, 0)) > 0) {
        buf[BUF_SIZE] = '\0';
        printf("%s", buf);
    }

    printf("\n");
    close(sock);
    return 0;
}
一旦我从我请求的页面中获取了整个HTML,
recv()
进程就会闲置。我知道
close(sock)
将结束它,但我不知道如何判断文件何时结束。我不知道如何让while循环退出,因为numbytes从不等于0或小于0。一旦它得到了最后一块,它就会闲置


如何判断何时收到我请求的文件结尾?

这是实现HTTP客户端的完全错误的方法。您必须正确解析响应,才能知道它的格式,然后它将指示如何调用
recv()
,以及何时停止调用它。像这样简单的
recv()
循环是不够的。@RemyLebeau如何正确解析响应,recv()调用会发生什么变化?@jpc看到我刚才链接到这个问题的重复答案。@Nina如果改用非身份
传输编码
头,则没有
内容长度
头。您必须分析HTTP头以了解主体的实际传输格式,然后相应地读取它。有些格式在数据本身中是自终止的(分块、MIME),有些则不是(内容长度、断开连接的EOF)。@jpc您必须实际实现HTTP协议才能理解您接收的数据。这是一个非常重要的问题,您可能应该从查看其他人制作的HTTP客户机并理解它或阅读HTTP规范开始。协议规范会告诉您何时有整个响应,它并不简单,而且会随所使用的编码而变化。也许从比HTTP1.1更简单的东西开始,比如HTTP0.9或1.0,因为它们更简单。