Socket客户端总是连接到本地主机

Socket Client always connects to localhost

本文关键字:主机 连接 客户端 Socket      更新时间:2023-10-16

我有一个问题,我的客户端似乎总是连接到本地主机(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 hostn");
        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);
    }

即使argv[1]为139.130.4.5,portnum为80,也总是会导致与本地主机的连接

In memcpy()函数:

#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);

第一个参数是目的地,第二个参数是源,所以不用

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

您有memcpy(3)的参数反向。应该是memcpy(dest, source, len):

memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);

同样,在调用memcpy()memset()时不应该强制转换为char *,因为它们接受void*作为参数,任何指针类型都可以隐式地转换为void*而不需要强制转换。强制类型转换只会使代码变得混乱,并可能隐藏潜在的错误(比如试图传入非指针类型)。