> Вот собственно такая задача... Нужно получить собственный IP-адрес и отправить
>его на сервер, чтобы сервер переслал его другому клиенту. Что бы
>тот к нам присоединился... Ну это собственно частности, но главный вопрос
>- как получить собственный IP, есть какаие-нибудь системные вызовы или только
>ручками в конфигурации прописывать?
Через ioctl'ы параметры сетевых интерфейсов вытаскиваются вот так:
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netdb.h>
#include <stdio.h>
#define MAX_NUM_IFREQ 512
int main(int argc, char ** argv)
{
struct ifconf Ifc;
struct ifreq IfcBuf[MAX_NUM_IFREQ], *pIfr;
int num_ifreq, i, fd;
struct sockaddr_in addrtmp;
unsigned char mac[10]={0};
Ifc.ifc_len=sizeof(IfcBuf);
Ifc.ifc_buf=(char *)IfcBuf;
if ((fd=socket(AF_INET, SOCK_DGRAM, 0))<0) { perror("ERROR socket(): "); return 1; }
if (ioctl(fd, SIOCGIFCONF, &Ifc)<0) { perror("ERROR ioctl(SIOCGIFCONF): "); close(fd); return 1; }
num_ifreq=Ifc.ifc_len/sizeof(struct ifreq);
for (pIfr=Ifc.ifc_req, i=0; i<num_ifreq; ++pIfr, ++i)
{
if (pIfr->ifr_addr.sa_family!=AF_INET) continue; // I dont need not internet interfaces
printf("\n[%d] Name = %s\n", i, pIfr->ifr_name);
if (ioctl(fd,SIOCGIFHWADDR, pIfr)<0) { perror("ERROR ioctl(SIOCGIFHWADDR): "); continue; }
memcpy(mac,(unsigned char *)&(pIfr->ifr_hwaddr.sa_data),sizeof(struct sockaddr));
printf("[%d] MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", i, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
if (ioctl(fd, SIOCGIFADDR, pIfr)<0) { perror("ERROR ioctl(SIOCGIFADDR): "); continue; }
memcpy(&addrtmp,&(pIfr->ifr_addr),sizeof(addrtmp));
printf("[%d] Address = %s\n",i, inet_ntoa(addrtmp.sin_addr));
if (ioctl(fd, SIOCGIFBRDADDR, pIfr)<0) { perror("ERROR ioctl(SIOCGIFBRDADDR): "); continue; }
memcpy(&addrtmp,&(pIfr->ifr_broadaddr),sizeof(addrtmp));
printf("[%d] BroadAddress = %s\n",i, inet_ntoa(addrtmp.sin_addr));
if (ioctl(fd, SIOCGIFNETMASK, pIfr)<0) { perror("ERROR ioctl(SIOCGIFNETMASK): "); continue; }
memcpy(&addrtmp,&(pIfr->ifr_addr),sizeof(addrtmp));
printf("[%d] MaskAddress = %s\n",i, inet_ntoa(addrtmp.sin_addr));
if (ioctl(fd, SIOCGIFFLAGS, pIfr)<0) { perror("ERROR ioctl(SIOCGIFFLAGS): "); continue; }
printf("[%d] IFF_UP=%s\n",i, pIfr->ifr_flags&0x1?"ON":"OFF");
printf("[%d] IFF_BROADCAST=%s\n",i, pIfr->ifr_flags&0x2?"ON":"OFF");
printf("[%d] IFF_DEBUG=%s\n",i, pIfr->ifr_flags&0x4?"ON":"OFF");
printf("[%d] IFF_LOOPBACK=%s\n",i, pIfr->ifr_flags&0x8?"ON":"OFF");
printf("[%d] IFF_P2P=%s\n",i, pIfr->ifr_flags&0x10?"ON":"OFF");
printf("[%d] IFF_NOTRAILERS=%s\n",i, pIfr->ifr_flags&0x20?"ON":"OFF");
printf("[%d] IFF_RUNNING=%s\n",i, pIfr->ifr_flags&0x40?"ON":"OFF");
printf("[%d] IFF_NOARP=%s\n",i, pIfr->ifr_flags&0x80?"ON":"OFF");
}
close(fd);
return 0;
}
С помощью обвязки getifaddrs вот так (только мак-адресом придется пожертвовать):
#include <ifaddrs.h>
#include <netinet/in.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
struct ifaddrs *ifa_ptr, *ifa_ptr_tmp;
if (getifaddrs(&ifa_ptr)!=0) { perror("ERROR getifaddrs: "); return 1;}
for (ifa_ptr_tmp=ifa_ptr; ifa_ptr_tmp->ifa_next!=NULL; ifa_ptr_tmp=ifa_ptr_tmp->ifa_next)
{
if (ifa_ptr_tmp->ifa_addr->sa_family!=AF_INET) continue; // I dont need not internet interfaces
printf("\nName = %s\n", ifa_ptr_tmp->ifa_name);
printf("Address = %s\n", inet_ntoa(((struct sockaddr_in *)(ifa_ptr_tmp->ifa_addr))->sin_addr));
printf("BroadAddress = %s\n", inet_ntoa(((struct sockaddr_in *)(ifa_ptr_tmp->ifa_broadaddr))->sin_addr));
printf("MaskAddress = %s\n", inet_ntoa(((struct sockaddr_in *)(ifa_ptr_tmp->ifa_netmask))->sin_addr));
printf("IFF_UP=%s\n", ifa_ptr_tmp->ifa_flags&0x1?"ON":"OFF");
printf("IFF_BROADCAST=%s\n", ifa_ptr_tmp->ifa_flags&0x2?"ON":"OFF");
printf("IFF_DEBUG=%s\n", ifa_ptr_tmp->ifa_flags&0x4?"ON":"OFF");
printf("IFF_LOOPBACK=%s\n", ifa_ptr_tmp->ifa_flags&0x8?"ON":"OFF");
printf("IFF_P2P=%s\n", ifa_ptr_tmp->ifa_flags&0x10?"ON":"OFF");
printf("IFF_NOTRAILERS=%s\n", ifa_ptr_tmp->ifa_flags&0x20?"ON":"OFF");
printf("IFF_RUNNING=%s\n", ifa_ptr_tmp->ifa_flags&0x40?"ON":"OFF");
printf("IFF_NOARP=%s\n", ifa_ptr_tmp->ifa_flags&0x80?"ON":"OFF");
}
freeifaddrs(ifa_ptr);
return 0;
}