0

開発しなければならないアプリケーションのクライアント側に問題があります。

私が実装しなければならない最初のフェーズは、ネットワークの「スキャン」であり、他のユーザーを検索します。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 で出力できますが、それをソケットに渡すときに次のようにします。うまくいきません!エラーはどこにありますか?

ありがとう

4

2 に答える 2

1

myIpAddr = addressBuffer1;

ここでは、FindMyIP 関数内のローカル バッファーを指すようにグローバル ポインターを設定しています。関数が終了すると、その配列はなくなります。

すべてのグローバルchar *myIpAddr, *myMask, *myBroad;配列を作成し、ローカルの addressBuffer1/2/3 の代わりに文字列をそれらに直接配置するだけです

于 2012-04-16T18:49:45.847 に答える
0

char *myBroad は、関数の終了後にその値を失う単なるアドレス ホルダーです。実際には、文字列配列を作成し、それをソケット API の他の関数に渡す必要があります。お役に立てれば!

于 2012-04-16T19:07:55.550 に答える