【发布时间】:2012-03-25 17:15:01
【问题描述】:
我开始在 C 编程语言中使用套接字。我正在尝试发出一个简单的 http 请求并将从 read() 获得的缓冲区存储在我的缓冲区中。为此,我使用了指针/realloc(),C 程序工作正常,编译没有错误,但它只读取 http 响应的一部分。
例如,如果我尝试获取 google 徽标的二进制文件:http://www.google.com/images/srpr/logo3w.png Content-Length 说 7007 字节,但 strlen(buffer) 说 5146 对我来说。我相信这里的错误是我的 buf_size 和realloc() 为什么 bytesreaded 是 7337,我相信这是标题的 330 个字节。
这是我的代码:
char *
httpget(const char * domain, const int port, const char * headers)
{
int sockfd; /* Socket file descrption */
int buf_size = MAX_BUFFER_SIZE;
struct sockaddr_in sock_addr;
struct hostent * host;
char * buffer;
char * newbuf;
char * tbuf;
sockfd = socket(AF_INET, /* Uses IPV4 Internet protocols */
SOCK_STREAM, /* Uses the TCP (Transfer Communication Protocol) */
0 /* "0" for socket () function choose the correct protocol based on the socket type. */
);
if( sockfd == -1 )
{
return NULL;
}
host = gethostbyname(domain);
if( NULL == host )
{
close(sockfd);
return NULL;
}
memset(&sock_addr, '\0', sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
memcpy( &sock_addr.sin_addr.s_addr,
host -> h_addr,
host -> h_length );
sock_addr.sin_port = htons(port);
if( connect(sockfd, (struct sockaddr *) &sock_addr, sizeof(sock_addr)) == -1)
{
close(sockfd);
return NULL;
}
if( write(sockfd, headers, strlen(headers) + 1) == -1)
{
close(sockfd);
return NULL;
}
buffer = malloc( MAX_BUFFER_SIZE );
tbuf = malloc( MAX_BUFFER_SIZE );
if(buffer == NULL || tbuf == NULL)
{
return NULL;
}
int bytesloaded = 0;
int readed;
while( (readed = read(sockfd, tbuf, MAX_BUFFER_SIZE)) > 0 )
{
if(bytesloaded + readed >= buf_size)
{
buf_size = buf_size + MAX_BUFFER_SIZE;
newbuf = realloc(buffer, buf_size);
if(newbuf != NULL)
buffer = newbuf;
else
return NULL;
}
memcpy(buffer + bytesloaded, tbuf, readed);
bytesloaded += readed;
}
//printf("bytesreaded = %d and buffer len is %d\n", bytesloaded, strlen(buffer));
free(tbuf);
close(sockfd);
return buffer;
}
然后:
char * domain = "www.google.com\0";
char * sheaders = "GET /images/srpr/logo3w.png HTTP/1.1\r\nHost:www.google.com\r\nConnection:close\r\n\r\n\n\0";
int port = 80;
char * response = httpget(domain, port, sheaders);
【问题讨论】: