套接字客户端始终连接到localhost

时间:2014-06-27 20:11:50

标签: c++ sockets

我有一个问题,我的客户端似乎总是连接到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

2 个答案:

答案 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*。演员阵容使代码混乱并且可能隐藏潜在的错误(比如尝试传入非指针类型)。

相关问题