sockaddr_in得到错误的 IP 地址,CPP

sockaddr_in gets wrong IP address, cpp

本文关键字:IP 地址 CPP 错误 in sockaddr      更新时间:2023-10-16

我正在尝试实现一个连接到给定地址的简单客户端。您会注意到,在将给定地址以及 IP 地址和端口放入sockaddr_in结构后,我正在打印它。我得到两个不同的地址,即使它应该是相同的。

这是我的代码:

int createConnection(char * address, char * port) {
    cout << address << " " << port << endl;
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(port));
    inet_aton(address,&(server.sin_addr));
    memset(&(server.sin_zero), '', 8);
    if ((sockFd = socket(PF_INET,SOCK_STREAM,0)) == -1) {
        perror("client: socket");
    }
    if (connect(sockFd,(const sockaddr *)&server,sizeof(struct sockaddr_in)) == -1) {
        close(sockFd);
        perror("client: connect");
    }
    char s[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, (struct sockaddr *)&server, s, sizeof s);
    printf("client: connecting to %s, %in", s, server.sin_port);
    printf("connected");
    return 0;
}

输出是

132.65.151.39 3000
client: connecting to 2.0.11.184, 47115

我的问题:

  1. 为什么我看到两个不同的地址?
  2. 为什么连接不失败?

发生的事情是我的程序稍后在 recv() 中被阻止,所以我认为它没有连接到我想要的地方。谢谢!

看起来你把错误的东西传递给inet_ntop()

inet_ntop(AF_INET, (struct sockaddr *)&server, s, sizeof s);

您可能应该通过.sin_addr

inet_ntop(AF_INET, &server.sin_addr, s, sizeof s);

对于端口,它打印错误,因为您需要调用ntohs()才能转换回主机字节顺序:

printf("client: connecting to %s, %in", s, ntohs(server.sin_port));

连接有效,可能是因为地址设置正确,实际上