1

我已将服务器-客户端应用程序编程为 RPC(低级)。

这是我的服务器功能来验证我的 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);

这不起作用。我得到一个分段错误。

4

2 回答 2

3

s_addr最可能是一个无符号的 32 位整数,所以你可以使用%ubut %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()

于 2012-05-05T19:07:38.057 回答
2

它很简单:

printf("Clientadress:%s", inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr.s_addr));
于 2013-04-21T10:32:13.690 回答