2012-05-05 13 views
1

RPC(低レベル)としてサーバークライアントアプリケーションをプログラミングしました。C:RPC低レベルアプリケーションをプログラミングする:クライアントからIPアドレスを取得する

これは私のIPアドレス(ここでは、単に必要な情報)を検証するために、私のサーバ機能である:

int *checkip_1_svc(ip_adress *argp, struct svc_req *rqstp) 
{ 
    static int result; 
    struct sockaddr_in test_ip; 

    result =1; 

    return(&result); 
} 

今私は、接続されたクライアントからのIPアドレスを印刷したいです。

私が試した:

printf("Clientadress:%s", rqstp->rq_xprt->xp_raddr.sin_addr.s_addr); 

をこれは動作しません。私はセグメンテーション違反を取得します。

+0

1)。 2) 'rqstp-> rq_xprt-> xp_raddr.sin_addr.s_addr'はおそらく文字列ではない* – wildplasser

+0

1)NULLポインタではありません。 2.)私は(char *)でそれをキャストしようとしましたが、うまくいきません! – JavaNullPointer

+0

よく、それは2)を残します:それは文字列ではありません。 – wildplasser

答えて

3

s_addr最もpropably符号なし32ビット整数であるので、あなたは%uが、%sを使用する場合があります。

printf("client address: %u", rqstp->rq_xprt->xp_raddr.sin_addr.s_addr); 

それはあなたが使用する可能性がありますa.b.c.d表記で出力させるには:の詳細については

#define SPLIT_S_ADDR_INTO_BYTES(\ 
    s_addr) \ 
    ((s_addr) >> 24) & 0xFF, \ 
    ((s_addr) >> 16) & 0xFF, \ 
    ((s_addr) >> 8) & 0xFF, \ 
    ((s_addr)  ) & 0xFF 

... 

printf(
    "client address: %hu.%hu.%hu.%hu", 
    SPLIT_S_ADDR_INTO_BYTES(ntohl(rqstp->rq_xprt->xp_raddr.sin_addr.s_addr))); 

... 

ntohl()man ntohl()を参照してください。

2

それは同じくらい簡単です:たぶん `rqstp`がNULLポインタである

printf("Clientadress:%s", inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr.s_addr)); 
関連する問題