我已将服务器 - 客户端应用程序编程为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);
这不起作用。我遇到了分段错误。
答案 0 :(得分:3)
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()
。
答案 1 :(得分:2)
这很简单:
printf("Clientadress:%s", inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr.s_addr));