2013-02-27 inet_ntop

by Vasil Kolev

Пишех малко код (опасна работа), съответно стигнах до момента, в който трябваше да изкарам някакъв адрес (ipv4 или ipv6) в четим вид. Тръгнах да ровя и открих, че има inet_ntop(), което поддържа и двете. Без да чета внимателно, написах следното:

struct sockaddr *saddr;

inet_ntop(saddr->sa_family, saddr, msg.ip, 255);

Това за всеки, който е погледнал по-внимателно man-а е ясно, че не работи – трябва да подам не sockaddr, а структурата вътре, я in_addr, я in6_addr – което е криво, понеже трябва да напиша няколко if-а и т.н.. Питах google, не намерих нищо особено полезно, след което отворих Unix Network Programming на Stevens около тая функция и какво открих – човекът е описал тоя проблем, и даже е написал sock_ntop(), който работи директно със sockaddr структурата (и реализира ония няколко if-а).
Ето примерен код как се реализира.

Въпросът е, защо в libc я няма тая функция? Мрън, книгата е вече на 16 години, все някой можеше да се сети и да вкара нещо такова.
(ако някой все пак се сеща за нещо такова в libc, да каже)

Tags:

4 Responses to “2013-02-27 inet_ntop”

  1. elwix Says:

    Добре де защо мрънкаш сега ?

    Направи си я функцията и си я сложи в твоя библиотека и си я ползвай със здраве.

    Ей няма угодия :)

  2. Vasil Kolev Says:

    @elwix, по тая логика да си направя и inet_pton направо, що да се занимават хората да пишат такава функция? Не може ли като правят нещо, да го правят докрай просто?

  3. Христо Says:

    Няма нужда от inet_pton, inet_pr0n е предостатъчна. ;-)

  4. gat3way Says:

    Не е перфектно решение, но предполагам ще свърши работа:

    #define my_inet_ntop(af,src,dst,size) ( inet_ntop((af), ((af) == AF_INET) ? (void*)(&((struct sockaddr_in*)(src))->sin_addr) : (void*)(&((struct sockaddr_in6*)(src))->sin6_addr), (dst), (size)) )

Leave a Reply