[英]C program halts after reading from socket
我的程序循环读取套接字并打印每个接收到的信息。 问题是我的代码将所有内容打印到stdout
,直到最后一次recv()
调用,即返回0 bytes
的调用。 在第二次到最后一次recv()
之后,我运行程序的终端在完成执行之前暂停了很长时间,具体取决于读取量(数据越多,暂停的次数越多)。
我尝试使用clock()
变量来记录代码片段之间的运行时间,但时间没有什么不同,即使最后一个printf()
需要很长时间才能出现在我的 VM 终端上。 我已经更改了代码,所以path
变量什么都不做,我运行它的方式是./exec www.google.com/randtext
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <arpa/inet.h>
void error(const char* msg){
perror(msg);
exit(0);
}
int main(int argc, char* argv[]){
int socketfd;
struct sockaddr_in serv_addr;
struct hostent* he;
char sendline[4096];
char reciveline[4096];
char* domain = argv[1];
char* path = strchr(domain, '/');
*path++ = '\0';
//printf("host: %s;\npath: %s\n", domain, path);
he = gethostbyname(domain);
if(he == NULL){
error("host error");
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr = *((struct in_addr *)he->h_addr);
socketfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&(serv_addr.sin_zero),8);
if (connect(socketfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1){
error("Connect");
}
memset(sendline, 0, sizeof(sendline));
//snprintf(sendline, sizeof(sendline), "GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", path, domain);
snprintf(sendline, sizeof(sendline), "GET / HTTP/1.1\r\nHost: %s\r\n\r\n", domain);
printf("%s\n", sendline);
send(socketfd, sendline, strlen(sendline), 0);
printf("Data sent.\n\n");
memset(reciveline,0,sizeof(reciveline));
int total = sizeof(reciveline)-1;
int bytes, i = 0;
do {
i++;
bytes = recv(socketfd,reciveline,total,0);
printf("Amount received : %d\n\n",bytes);
if (bytes < 0)
error("ERROR reading response from socket");
if (bytes == 0){
printf("\n\nbrokefree!\n\n");
break;
}
reciveline[bytes] = '\0';
printf("%s", reciveline);
memset(reciveline,0,sizeof(reciveline));
} while (1);
close(socketfd);
printf("Total loops : %d\n",i);
return 0;
}
在 HTTP 1.1 中,连接默认是持久的,这意味着它们不会立即关闭(与 HTTP 1.0 不同,默认情况下连接在每次请求后关闭)。
如果您希望连接是非持久连接,则需要使用Connection: close
header 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.