2012-04-16 65 views
0

我有一个应用程序的客户端问题,我必须开发。UDP套接字广播和ifaddrstruct

我必须执行的第一个步骤是对网络进行“扫描”,搜索其他用户。我决定使用UDP套接字,并且它们正常工作。如果我使用广播IP地址(getnamebyhost(“192.168.1.255”)),它工作正常。问题是应用程序必须在不同的网络上工作,并且我不知道IP地址(192.168或10.0或其他)。我必须学习地址,所以我在网上找到使用getifaddr()。下面的代码:

#include <stdio.h>  
#include <sys/types.h> 
#include <ifaddrs.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <string.h> 


int FindMyIp(); 
int IsConnected(); 

char *myIpAddr, *myMask, *myBroad; 

int main (int argc, const char * argv[]) { 

    int checkConnection=0; 
    checkConnection = IsConnected(); 
    while (checkConnection == 0) { 
     printf("Checking again..\n"); 
     checkConnection = IsConnected(); 
     sleep(2); 
    } 
    checkConnection=0; 
    printf("\nConnected to a new network..\n"); 
    while (checkConnection == 0) { 
     checkConnection = FindMyIp(); 
     if (checkConnection==0) { sleep(2); } 
    } 
    printf("My IP is %s\n", myIpAddr); 
    printf("My Mask is %s\n", myMask); 
    printf("The Broadcast IP is %s\n", myBroad); 
    return 0; 
} 


int IsConnected() 
{ 
    if (system("ping -c 1 www.google.com")){ 
     return 0; 
    } 
    else { 
     return 1; 
    } 
} 

int FindMyIp() 
{ 
    struct ifaddrs * ifAddrStruct=NULL; 
    struct ifaddrs * ifa=NULL; 
    void * tmpAddrPtr=NULL; 
    printf("Acquiring interface information.. "); 
    getifaddrs(&ifAddrStruct); 
    printf("Checking for wanted interface..\n"); 
    int i=0, connected=0; 
    ifa = ifAddrStruct; 
    while (i!=1) { 
     if ((ifa ->ifa_addr->sa_family==AF_INET)&&(ifa->ifa_name[0]=='e')&&(ifa->ifa_name[1]=='n')&&(ifa->ifa_name[2]=='1')) { 
      i=1; 
      connected=1; 
     } 
     else { 
      if (ifa->ifa_next == NULL) { 
       printf("error"); 
       return connected; 
      } 
      ifa = ifa->ifa_next; 
     } 
    } 
    char addressBuffer1[INET_ADDRSTRLEN]; 
    char addressBuffer2[INET_ADDRSTRLEN]; 
    char addressBuffer3[INET_ADDRSTRLEN]; 
    tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; 
    inet_ntop(AF_INET, tmpAddrPtr, addressBuffer1, INET_ADDRSTRLEN); 
    myIpAddr = addressBuffer1; 
    tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr; 
    inet_ntop(AF_INET, tmpAddrPtr, addressBuffer2, INET_ADDRSTRLEN); 
    myMask = addressBuffer2; 
    tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_broadaddr)->sin_addr; 
    inet_ntop(AF_INET, tmpAddrPtr, addressBuffer3, INET_ADDRSTRLEN); 
    myBroad = addressBuffer3; 
    return connected; 
} 

所以在myBroad我应该保存广播IP地址,这是,我可以用printf的打印,但是当我将它传递给由插座:结构hostent * HPTR =的gethostbyname( myBroad);它不会工作! 错误在哪里?

谢谢

回答

1

myIpAddr = addressBuffer1;

这里您将设置一个全局指针指向FindMyIP函数内的本地缓冲区。该函数结束时该数组已经消失。

只需要让所有的全球char *myIpAddr, *myMask, *myBroad;一个数组,直接放在串到这些,而非本地addressBuffer1/2/3

+0

非常感谢!它的工作原理:) 明天我会发布工作代码。 – phcaze 2012-04-16 19:07:45

0

的char * myBroad只是一个地址持有人,其结束后失去其价值功能。实际上,您需要创建一个字符串数组并将其传递给套接字API的其他功能。希望这可以帮助!