2012-04-16 7 views
0

У меня проблема с клиентской частью приложения, которое я должен разработать.UDP Socket broadcast и 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, но когда я прохожу его к разъему с помощью: STRUCT hostent * hptr = gethostbyname (myBroad); это не сработает! Где ошибка?

Благодаря

ответ

1

myIpAddr = addressBuffer1;

Здесь вы устанавливаете глобальный указатель, указывающий на локальный буфер внутри функции FindMyIP. Этот массив исчезнет, ​​когда функция закончится.

Просто сделайте все ваши глобальные char *myIpAddr, *myMask, *myBroad; массив и поместить строки непосредственно в них, вместо локального addressBuffer1/2/3

+0

спасибо! Это работает :) Завтра я отправлю рабочий код. – phcaze

0

полукокса * myBroad только держатель адрес, который теряет свою ценность после окончания функция. Вам действительно нужно создать массив строк и передать его в дополнительные функции сокета API. Надеюсь это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^