【问题标题】:what ip address does accept return什么IP地址接受返回
【发布时间】:2009-11-07 18:00:23
【问题描述】:

见以下代码:

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

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

【问题讨论】:

  • 我在您的代码中看到一个信号量 - 确保其他线程不会同时使用相同的地址结构。 IE。这可能是一个竞争条件。
  • 该代码没有将“slen”参数初始化为接受调用。确保将 slen 设置为 sizeof(cliaddr)。
  • @Nikolai: 只有一个线程在运行
  • @nos 回答了我的问题。我将 slen 初始化为 sizeof(cliaddr) 并且代码有效。但是如果我们不初始化 slen,那么我们如何解释这个行为。

标签: networking network-programming ip-address


【解决方案1】:

您在调用inet_ntop() 时缺少第四个参数。这是一个工作示例:


  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 ));
  ...

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

【讨论】:

  • + "与网络通信时始终检查错误"。
【解决方案2】:

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

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

【讨论】:

  • 客户端使用属于 AF_INET 系列的套接字连接并在 localhost 上运行。
  • 我可能有另一种解释。请参阅我的其他答案。
【解决方案3】:

我的下一个猜测:

  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.

【讨论】:

  • 为什么还要打印 232.76.213.191
  • 我觉得跟虚拟机有关。
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 2016-10-07
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2012-04-12
相关资源
最近更新 更多