2012-05-05 2 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) Может быть, 'rqstp' является NULL указатель. 2) 'rqstp-> rq_xprt-> xp_raddr.sin_addr.s_addr', вероятно, * не строка * – wildplasser

+0

1) это не NULL-указатель. Я попробовал. 2.) Я попытался использовать его (char *), но это тоже не работает! – JavaNullPointer

+0

хорошо, что оставляет 2): это не строка. – wildplasser

ответ

3

s_addr наиболее Propably является неподписанных 32bit целое число, так что вы можете использовать %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)); 
Смежные вопросы