【问题标题】:C: Programming a RPC Low Level Application: getting the IP address from clientC:编写 RPC 低级应用程序:从客户端获取 IP 地址
【发布时间】:2012-05-05 10:47:56
【问题描述】:

我已将服务器-客户端应用程序编程为 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);

这不起作用。我遇到了分段错误。

【问题讨论】:

  • 1) 可能rqstp 是一个空指针。 2) rqstp->rq_xprt->xp_raddr.sin_addr.s_addr 可能不是字符串
  • 1) 它不是空指针。我试过了。 2.) 我尝试使用 (char*) 进行投射,但这也不起作用!
  • 好吧,剩下 2) :它不是字符串。
  • 你知道如何转换它或将它复制到一个字符串 ;-) 吗?
  • 尝试以十六进制打印,格式为“%08x”。 (由于您的代码不完整且不全面,我无法为您提供更多帮助)

标签: c client-server rpc


【解决方案1】:

s_addr 最可能是一个无符号的 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】:

    很简单:

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

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2012-06-06
      • 2016-10-31
      相关资源
      最近更新 更多