2012-06-07 170 views
0

我能够得到返回的端口,但IP不是。我应该使用除getsockname之外的其他东西吗? THX无法从getsockname获取本地主机IP地址?

 if ((sock = ::socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
      c.Format("Socket Error: %d", GetLastError()); 
      tcpMESSAGE = 1; 
      break; 
     } 


     server_addr.sin_family = AF_INET;   
     server_addr.sin_port = htons(4000); //port setting  
     server_addr.sin_addr.s_addr = INADDR_ANY; 

     if (::bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { 
      c.Format("Bind Error: %d", GetLastError()); 
      tcpMESSAGE = 1; 
      break; 
     } 

     if(1==1){ 
      int len = sizeof server_addr; 
      if(::getsockname(sock,(struct sockaddr*)&server_addr,&len) == -1) 
       MessageBox("Error local host ip"); 

      c.Format("local addr %s:%u\n errno: %d",inet_ntoa(server_addr.sin_addr),ntohs(server_addr.sin_port), errno); 
      MessageBox(c); 
     } 
+0

设置为“errno”的是什么? – sarnold

+0

如果'getsockname()'返回一个错误,它会设置'errno'。尝试调试时不知道它肯定比它需要更难... – sarnold

+0

当我MessageBox的IP地址和端口时errno为0 – jdl

回答

5

您绑定到INADDR_ANY,但是你有没有连接插座的同行呢,所以没有IP为getsockname()返回。通过connect()accept()建立连接后,getsockname()可以返回用于该连接的特定IP。仅仅绑定是不够的,除非你绑定到一个特定的IP,你没有做。

+0

如何显示计算机给出的IP地址。我需要显示iPod用户的IP地址才能连接。 thx – jdl

+1

@jdl:BSD套接字API没有函数来枚举本地IP地址,但许多操作系统都提供了一个'getifaddrs()'函数来执行此操作。 – caf

+1

在许多情况下,调用'gethostname()'后跟'gethostbyname()'将返回本地IP,但这不是100%保证,具体取决于主机名的特定DNS配置。如果'getifaddrs()'可用,则使用它,否则您必须改用平台特定的API。 –