我有一个问题,我的客户端似乎总是连接到localhost(127.0.0.1),即使我传递了另一个地址。考虑: $ ./client 139.130.4.5 80
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
error("Opening Socket");
}
if ( (server = gethostbyname(argv[1])) == NULL) {
fprintf(stderr,"ERROR, no such host\n");
close(sockfd);
exit(0);
}
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portnum);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) == -1){
error("Connect", sockfd);
}
这始终会导致与localhost的连接,即使argv[1]
为139.130.4.5且portnum
为80
答案 0 :(得分:3)
在memcpy()函数中:
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
第一个参数是destination,第二个参数是source,所以不是
memcpy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
你应该写
memcpy( &serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
// ^ as Adam pointed out, no (char*) here
答案 1 :(得分:2)
你向memcpy(3)
的论点倒退了。它应该是memcpy(dest, source, len)
:
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
此外,您不应该在char *
和memcpy()
的调用中转换为memset()
,因为它们将void*
作为参数,并且任何指针类型都可以在没有演员表的情况下隐式转换为void*
。演员阵容使代码混乱并且可能隐藏潜在的错误(比如尝试传入非指针类型)。