在C中发出Get-HTTP请求

  • 本文关键字:Get-HTTP 请求 c
  • 更新时间 :
  • 英文 :


我正在尝试制作一个C文件,该文件使用HTTP协议检索网页。GET请求接受3个参数,即主机名、网页和端口号。

void error(const char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char* argv[]){
if(argc < 4){
fprintf(stderr, "usage %s [hostname][filepath][port#]", argv[0]);
exit(0);
}
int byte_info;
int sockfd;
struct hostent *host_server;
struct sockaddr_in server_addr;
char buffer [256];
char *asprint_str;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
host_server = gethostbyname(argv[1]);
if(host_server == NULL)
{
fprintf(stderr, "Server not foundnn");
exit(0);
}
bzero((char*) &server_addr, sizeof(server_addr));
server_addr.sin_port = htons(atoi(argv[3]));
server_addr.sin_family = AF_INET;
bcopy((char*) host_server->h_addr, (char*) &server_addr.sin_addr.s_addr, sizeof(server_addr));
if (sockfd < 0)
error("Error opening socket");
if(connect(sockfd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0)
error("Couldn't connect");
bzero(buffer, 256);
asprintf(&asprint_str, "GET %s HTTP/1.1rnHOST: %srnrn", argv[2], argv[3]);
printf("%s", asprint_str);
byte_info = write(sockfd, asprint_str, strlen(asprint_str));
if (byte_info < 0)
error("Write to socket failed");
else
{
printf("HTTP Resuest sent to host servernn");
while(byte_info > 0)
{
bzero(buffer, 256);
byte_info = read(sockfd, buffer, 255);
if (byte_info > 0)
printf("%s", buffer);
}

}
close(sockfd);   
}

每次我试图编译时,我都会收到这样的错误:

$ gcc -Wall -g -D_GNU_SOURCE -o Get Get.c
Get.c: In function ‘main’:
Get.c:45:5: warning: ‘__builtin_memmove’ writing 16 bytes into a region of size 12 overflows the 
destination [-Wstringop-overflow=]
45 |     bcopy((char*) host_server->h_addr, (char*) &server_addr.sin_addr.s_addr, sizeof(server_addr));
|     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我是C的新手,我正在努力理解这个错误意味着什么,以及我需要做些什么来修复它

警告原因:您正在向host_server->h_addr写入更多字节(额外4个字节(,这会导致溢出。您只能写入host_server->h_length字节。

解决方案:

更改

bcopy((char*) host_server->h_addr, (char*) &server_addr.sin_addr.s_addr, sizeof(server_addr));

bcopy((char*) host_server->h_addr, (char*) &server_addr.sin_addr.s_addr, host_server->h_length);

`

最新更新