2012-04-16 1 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; 
} 

그래서 브로드 캐스트 IP 주소를 저장해야하고, 내가 printf와 함께 인쇄 할 수 있습니다,하지만 myBroad에 나는에 의해 소켓에 통과 할 때 : (hostent 구조체 * hptr = gethostbyname까지도 myBroad); 그것은 작동하지 않습니다! 어디서 오류가 있습니까?

감사

답변

1

myIpAddr = addressBuffer1;

여기서 FindMyIP 함수 내에서 로컬 버퍼를 가리키는 전역 포인터를 설정합니다. 함수가 끝나면 배열이 사라집니다.

대신 로컬 addressBuffer1/2/3

+0

대단히 감사합니다! 그것은 작동합니다 :) 내일 작업 코드를 게시 할 것입니다. – phcaze

0

문자의, 그냥 모든 char *myIpAddr, *myMask, *myBroad; 글로벌 배열을하고, 이들에 직접 문자열을 배치 * myBroad이 끝난 후 그 값을 푼다 그냥 주소 홀더입니다 기능. 실제로 문자열 배열을 만들어 소켓 API의 추가 기능에 전달해야합니다. 희망이 도움이!