什么IP地址接受返回

时间:2009-11-07 18:00:23

标签: networking network-programming ip-address

请参阅以下代码:

accept(sockfd, (struct sockaddr*)&cliaddr, &slen);
cout << inet_ntop(AF_INET, cliaddr.sin_addr, ipv4addr, 100);

我的客户端从localhost连接。 我在输出中得到一个荒谬的地址。这不是我的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

3 个答案:

答案 0 :(得分: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 ));
  ...

与网络通话时始终检查错误。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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。&lt;&lt;聪明到取消引用正在返回的指针,还是打印出指针?