代码之家  ›  专栏  ›  技术社区  ›  Mikhail Zakharov

在macos上获取套接字对等IP地址的正确方法

  •  0
  • Mikhail Zakharov  · 技术社区  · 5 年前

    我正在尝试这个简单的代码,去获取客户的IP地址。它在FreeBSD上运行良好,但在Mac上奇怪地返回零。感到困惑,不明白怎么了。拜托,救命啊。

    #include <stdio.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    
    int main() {
        int s, c;
        socklen_t len;
        struct sockaddr_in saddr, caddr;
    
        if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
            printf("socket()\n"); exit(1);
        }
        
        saddr.sin_family = AF_INET;
        saddr.sin_addr.s_addr = htonl(INADDR_ANY);
        saddr.sin_port = htons(9090);
    
        if ((bind(s, (struct sockaddr *)&saddr, sizeof(saddr))) != 0) {
            printf("bind()\n"); exit(1);
        }
    
        if ((listen(s, 5)) != 0) {
            printf("listen()\n"); exit(1);
        }
    
        if ((c = accept(s, (struct sockaddr *)&caddr, &len)) < 0) {
            printf("accept()\n"); exit(0);
        }
    
        char ipstr[INET6_ADDRSTRLEN];
        inet_ntop(AF_INET, &caddr.sin_addr, ipstr, len);
        
        printf("Client IP address: [%s:%d]\n", ipstr, ntohs(caddr.sin_port));
    
        close(c);  close(s);
    
        return 0;
    }
    

    在FreeBSD上:

    Client IP address: [127.0.0.1:17225]
    

    在Mac上:

    Client IP address: [0.0.0.0:0]
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Some programmer dude    5 年前

    你呢 必须 初始化 len accept 接受

    len = sizeof caddr;
    if ((c = accept(s, (struct sockaddr *)&caddr, &len)) < 0) { ... }
    

    如果它没有初始化,它将有一个 (读:垃圾)可能导致 未定义的行为

    推荐文章