getpeername多次运行服务器后的参数无效

时间:2015-04-15 12:33:29

标签: c tcp server

我有这个,取自beej指南并略微改编:

socklen_t len;
    struct sockaddr_storage addr;
    char ipstr[INET6_ADDRSTRLEN];
    char nombreSubscriptor[INET6_ADDRSTRLEN+sizeof(int)];
    int port;

    len = sizeof(addr);
    if(getpeername(fdSocketDevuelto, (struct sockaddr*)&addr, &len)<0){
        perror("GETPEERNAME error");
        close(fdSocketDevuelto);
        exit(1);
    }
 if (addr.ss_family == AF_INET) {
        struct sockaddr_in *s = (struct sockaddr_in *)&addr;
        port = ntohs(s->sin_port);
        inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
    } else { // AF_INET6
        struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
        port = ntohs(s->sin6_port);
        inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
    }

    printf("Peer IP address: %s\n", ipstr);
    printf("Peer port      : %d\n", port);

所以我运行客户端和服务器并向服务器发送消息,一切正常,显示如下

Peer IP address: 127.0.0.1
Peer port      : 42639

但是,如果我关闭并打开几次(有时它会在前1-2次我尝试它,但这种情况发生的次数减少了),在某些时候我得到了这个:

 GETPEERNAME error: Invalid argument

在我使用perpe并在getpeername中退出(1)之前,我得到的东西与此类似(它的数字略有变化):

Peer IP address: 2325:2ec7:c37f::
Peer port      : 20423

我已经问过这里Recv gives Bad file descriptor only sometimes (run the program it works fine, sometimes it does not work),但问题是错误的,因为它不是具有失败的recv,它是getpeername函数。我这次决定再次提供适当的数据,我不确定这是否正确。

问题是:为什么会发生这种情况?为什么有时它会通过而且Ip很好,有时候不是?这是代码的两个完全不同的运行,我关闭并再次运行,并且不编译或执行任何操作。当它给我失败时,我会等待几分钟(这看起来也会不时发生变化),我可以再次运行,它再次正常运行。

0 个答案:

没有答案