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: работа
February 27th, 2013 at 10:06
Добре де защо мрънкаш сега ?
Направи си я функцията и си я сложи в твоя библиотека и си я ползвай със здраве.
Ей няма угодия :)
February 27th, 2013 at 11:25
@elwix, по тая логика да си направя и inet_pton направо, що да се занимават хората да пишат такава функция? Не може ли като правят нещо, да го правят докрай просто?
March 1st, 2013 at 01:06
Няма нужда от inet_pton, inet_pr0n е предостатъчна. ;-)
March 1st, 2013 at 15:23
Не е перфектно решение, но предполагам ще свърши работа:
#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)) )