当没有更多的数据可读取时,如何判断stop recv()是否处于空闲状态?
实际上,我向某个URL发送GET请求,并使用当没有更多的数据可读取时,如何判断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() {
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,因为它们更简单。