2012-02-10 15 views
2

こんにちは私は受け入れられたsockFDを入力として受け取り、プレゼンテーション形式のIPアドレスを文字列に出力する関数を作成しました。この関数は、ヌルポインタを返すinet_ntopからの呼び出しで文字列をパッキングしてエラーを表示するまで、正常に動作しているようです。エラーは、RAMとROMを十分に持っているため、私が理解していないデバイスにスペースが残っていないと表示されます。とにかく私が使用している機能は荒いです。inet_ntop:デバイスにスペースが残っていない

void getTheirIp(int s, char *ipstr){ // int s is the incoming socketFD, ipstr points the the calling 
        // functions pointer. 
    socklen_t len; 
    struct sockaddr_storage addr; 
    len = sizeof(addr);   //I want to store my address in addr which is sockaddr_storage type 
    int stat; 
    stat = getpeername(s, (struct sockaddr*)&addr, &len); // This stores addrinfo in addr 
printf("getTheirIP:the value of getpeername %d\n",stat); 
    // deal with both IPv4 and IPv6: 
    if ((stat=addr.ss_family) == AF_INET) { // I get the size of the sock first 
     printf("getTheirIP:the value of addr.ss_family is %d\n",stat); 
     ipstr = malloc(INET_ADDRSTRLEN); // I allocate memory to store the string 
     struct sockaddr_in *s = (struct sockaddr_in *)&addr; // I then create the struct sockaddr_in which 
           // is large enough to hold my address 
     if(NULL == inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr))){ // I then use inet_ntop to 
     printf("getTheirIP:the value of inet_ntop is null\n");// retrieve the ip address and store 
     perror("The problem was");    // at location ipstr 
     } 

    } else { // AF_INET6 this is the same as the above except it deals with IPv6 length 
     ipstr = malloc(INET6_ADDRSTRLEN); 
     struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; 
     inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof(ipstr)); 
    } 
    printf("%s",ipstr); 
} 

収まるには大きすぎると、私はこの部分の修正に集中したいので、私はプログラムの残りの部分を残しました。しかし、私はこの関数を呼び出すmain()の一部を紹介します。

newSock = accept(listenSock,(struct sockaddr *)&their_addr,&addr_size); 
    char *someString; 
    getTheirIp(newSock,someString); 

助けがあれば助かります。ありがとう! ipstrポインタ(それは、ポインタのサイズが得られます、4または8のようなもの)であるため、sizeofが間違っていること

答えて

7
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr)) 

。使用可能なバッファーの長さは、ipstrにする必要があります。

+0

私は、あなたが割り当てたメモリの量と、実際のアドレスのサイズではありません。それはあなたが意味することですか?私はsizeof()が割り当てられたメモリの量を得ていると思った。ありがとう!!! –

+1

あなたはまったく支配してくれました。 –

4

としては、マンページで説明した、inet_ntopからENOSPCを取得する手段:

変換されたアドレス文字列がサイズによって指定されたサイズを超えてしまいます。

あなたは ipstrチャーポインタがかかるストレージの量でサイズ引数として(ipstr)はsizeof与えます。バッファのサイズを渡す必要があります。手始めに

1

、私が代わりにダブルポインタを使用したい:

void getTheirIp(int s, char **ipstr_pp) 

次へ]を - これは間違っている:ipstrは4バイトのポインタです:

inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr) 

私はしたいと思います」代わりにINET_ADDRSTRLENを使用してください。

最後に、実際のエラー#を印刷することをお勧めします。少なくとも完全なperror()テキストを切り取って貼り付けてください(私はエラー#を含めるべきです)。

+0

JFTR:perror()には通常、errnoの数値は含まれませんが、strerror(errno)は含まれています。正確に言えば、POSIXには、ユーザー指定の文字列、コロン、そしてstrerror()と同じメッセージが含まれている必要があります。 – fnl

+0

ダブルポインタは私が持っていたであろう質問に答えます。ありがとう。 –

関連する問題