getsockname(2)
, за которым следует getnameinfo(3)
, сообщает IP-адрес, который ваш стек TCP / IP назначил сокету.(Очевидно, что это не будет соответствовать тому, что клиент мог бы использовать, если сервер и клиент находятся на противоположных сторонах системы NAT; в этом случае, возможно, существует хитрая хитрость UPnP для обнаружения IP-адреса, который клиент может использовать для связи с сервером..)
Я предполагаю, что ваш сервер выглядит примерно так:
lfd = socket();
ret = bind(lfd,...);
connection = listen(lfd, 10);
/* add connection to your select queue or poll queue */
Вы можете добавить код, подобный следующему:
struct sockaddr_storage me;
socklen_t *len = sizeof(me);
char name[40];
ret = getsockname(connection, &me, &len);
ret = getnameinfo(&me, &len, name, sizeof(name), NULL, 0, NI_NUMERICHOST);
getnameinfo(3)
проверяет struct sockaddr_storage
me
для вашего IP-адреса.Поскольку это общие интерфейсы, он будет работать для адресов IPv4 или IPv6.