2009-11-07 89 views
0

看到下面的代码:什么IP地址不接受退货

​​

我的客户从本地主机连接。 我在输出中得到了一个荒谬的地址。这不是我的IP地址。每当我运行代码我得到一个不同的IP地址。当我ping那个IP地址时,我没有得到任何回应。

是什么原因。

我在windows vista的虚拟机上运行suse linux。

更新

bzero(&cliaddr, sizeof(cliaddr)); 
int connfd = accept(sockfd, (struct sockaddr*)&cliaddr, &slen); 

if (sem_wait(&mutex) < 0) 
    err_sys("sem_init error"); 

char ipv4addr[100]; 
cout << inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100) << endl; 

//const char* p = inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100); 
//cout << p << endl; 

//cout << (void*)p << " " << (void*)ipv4addr << endl; 

这个返回地址为0.0.0.0

如果我取消注释行,我得到了所有行的正确地址,127.0.0.1

+0

我在代码中看到一个信号量 - 确保其他线程不会同时使用相同的地址结构。即这可能是一种竞争条件。 –

+0

该代码不会将'slen'参数初始化为accept调用。确保你将slen设置为sizeof(cliaddr)。 – nos

+0

@Nikolai:只有一个线程运行 –

回答

4

您在致电inet_ntop()时错过了第4个参数。这是一个工作示例:


    int sockfd, fd; 
    struct sockaddr_in saddr; 
    socklen_t len = sizeof(saddr); 
    char addr_buf[INET_ADDRSTRLEN]; /* defined in <netinet/in.h> */ 

    /* ... socket(), bind(), listen() */ 

    bzero(&saddr, len); 
    if ((fd = accept(sockfd, (struct sockaddr*)&saddr, &len)) == -1) 
    { perror("accept"); exit(1); } /* watch out for EINTR */ 

    if (inet_ntop(AF_INET, &saddr.sin_addr, addr_buf, 
    INET_ADDRSTRLEN) == NULL) 
    { perror("inet_ntop"); exit(1); } 

    printf("accepted connection from [%s:%d]\n", 
    addr_buf, ntohs(saddr.sin_port)); 
    ... 

与网络交谈时总是检查错误。

+0

len没有初始化。因此错误。 –

+0

+“与网络交谈时总是检查错误”。 –

0

我未经证实的猜测是,您将获得IP v6地址而不是v4,因此您的转换已关闭。

您可能想尝试使用netstat来查找客户端的端口(通常您会得到一个1025到65535之间的随机排序端口号),并查看十六进制值是否出现在cliaddr的十六进制表示中。如果客户端端口与您认为是客户端地址之间存在关联,那么您的转换不正确。

+0

客户端使用属于AF_INET系列的套接字进行连接,并且正在本地主机上运行。 –

+0

inet_ntop在这种情况下也应该返回一个错误。 –

+0

我可能有另一种解释。看到我的其他答案。 –

0

我的下一个猜测:

On success, inet_ntop() returns a non-null pointer to dst. NULL is 
     returned if there was an error, with errno set to indicate the error. 

是COUT。 < <聪明到足以取消引用正在返回的指针,或者你打印出指针吗?

+0

为什么要打印 232.76.213.191 –

+0

我认为它与虚拟机有关。 –

+0

好吧,我放弃了。祝你好运!我的程序中的 –