我的程序在循环中从套接字读取并打印每个接收。问题是,我的代码将所有内容打印到stdout
,直到最后一个recv()
调用,即返回0 bytes
的调用。在第二个到最后一个recv()
之后,我运行程序的终端在完成执行之前会暂停很长时间,这取决于读取的数量(数据越多,停止的次数越多)。
我尝试使用clock()
变量来记录代码片段之间的运行时间,但时间没有什么不同,即使最后一个printf()
花了很长时间才出现在我的虚拟机终端上。我更改了代码,使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;
}
1条答案
按热度按时间c3frrgcw1#
在HTTP 1.1中,连接默认为 persistent,这意味着它们不会立即关闭(不像HTTP 1.0,默认情况下,连接在每次请求后关闭)。
如果您希望连接是非持久性的,则需要使用
Connection: close
header。