我正在尝试制作一个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);
`