Определение своего ip средствами C

Модератор: Модераторы разделов

h8u
Сообщения: 6

Определение своего ip средствами C

Сообщение h8u »

Мне надо определить свой ip адресс в сети исползуя C
Я вот что-то наваял да только определяется всегда только 127.0.0.1

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
struct hostent *h;
struct in_addr add;
long int *hip;
char localhost[129];
if (gethostname(localhost, 128) < 0)
return 1;
if ((h = gethostbyname(localhost)) != NULL)
{
hip = (long int*)h->h_addr_list[0];
while (*hip != 0)
{
printf("%ld\n", *hip);
add.s_addr = *hip;
printf("%s\n", inet_ntoa(add));
hip++;
}
}
return 0;
}
Спасибо сказали:
Аватара пользователя
ilich
Сообщения: 156

Re: Определение своего ip средствами C

Сообщение ilich »

Ты вместо localhost указывай имя своего компьютера, имхо с именем localhost связан адрес 127.0.0.1.
!!! БЕРИ ОТ ЖИЗНИ ВСЕ !!!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Определение своего ip средствами C

Сообщение sash-kan »

(h8u @ Пятница, 08 Июля 2005, 0:59) писал(а):Мне надо определить свой ip адресс в сети исползуя C

немного дополнительной информации для понимания всей сложности данного вопроса:
1. ip-адрес может быть канонический ipv4, может быть ipv6
2. ip-адресов на _одном_ интерфейсе может быть наконфигурировано произвольное кол-во (верхн. предел, кажется ~32768)
3. интерфейсов тоже может быть произвольное кол-во (есть, конечно, верхняя граница, но, думаю, тоже где-то в районе 32768)
вот и подумай, что тебе, собственно говоря, нужно (:
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
h8u
Сообщения: 6

Re: Определение своего ip средствами C

Сообщение h8u »

Ну и где-же взять имя своего компа? gethostname - Разве не это делает?
А IP адрес мне нужен для icq-клиента(я его пытаусь написать, там в login-пакете надо отослать свой ip).
Подскажите как его узнать с помощью С.
Спасибо сказали:
MaGIc laNTern
Сообщения: 537
Статус: 人です
ОС: Gentoo

Re: Определение своего ip средствами C

Сообщение MaGIc laNTern »

Хоть Я пока что обсолютно не знаком с C, могу предположить что gethostname выдаёт IP по уже известному хосту (в Вашем случае - localhost).
Спасибо сказали:
h8u
Сообщения: 6

Re: Определение своего ip средствами C

Сообщение h8u »

Ну вот если не знаком напиши "man gethostname".
А ip Выдаёт gethostbyname("има_хоста");
да и то не в чистом виде а ссылкой на структуру.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Определение своего ip средствами C

Сообщение KiWi »

(h8u @ Суббота, 09 Июля 2005, 1:39) писал(а):Ну вот если не знаком напиши "man gethostname".
А ip Выдаёт gethostbyname("има_хоста");
да и то не в чистом виде а ссылкой на структуру.

берёшь gethostname(hostname.domainname)
и пытаешься получить... :-)

и там разве это обязательно?
Спасибо сказали:
h8u
Сообщения: 6

Re: Определение своего ip средствами C

Сообщение h8u »

Синтаксис функции
int gethostname(char *name, size_t len);
а не то что вы пишете.
И всё время эта функция возвращает "localhost" - который связан с 127.0.0.1
Спасибо сказали:
MaGIc laNTern
Сообщения: 537
Статус: 人です
ОС: Gentoo

Re: Определение своего ip средствами C

Сообщение MaGIc laNTern »

(h8u @ Суббота, 09 Июля 2005, 2:39) писал(а):Ну вот если не знаком напиши "man gethostname".
А ip Выдаёт gethostbyname("има_хоста");
да и то не в чистом виде а ссылкой на структуру.

А ну собственно Я хорошо (учусь до профессионального уровня) знаком с PHP, там тоже есть gethostbyname который это и делает, просто Я думал что gethostname в C идентичен gethostbyname в PHP, оказалось нет.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Определение своего ip средствами C

Сообщение KiWi »

(h8u @ Суббота, 09 Июля 2005, 13:06) писал(а):Синтаксис функции
int gethostname(char *name, size_t len);
а не то что вы пишете.
И всё время эта функция возвращает "localhost" - который связан с 127.0.0.1

зайди в консоль и набери:
hostname
и
domainname

они по хорошему должны резолвиться... правда у меня они стоят на 127.0.0.1 :D
но может повезёт
вариант 2: берёшь вывод /sbin/route
берёшь интерфейс, через который идёт нужный трафик, смотришь ip этого интерфейса... только там вроде пофиг какой ip :-)
Спасибо сказали:
h8u
Сообщения: 6

Re: Определение своего ip средствами C

Сообщение h8u »

Мне надо узнать свой ip только средствами C, без всяких консольных команд.
Используя системные вызовы.
Если такими метедами то можно и ifconfig, и в /proc посмореть...
Спасибо сказали:
grooz
Сообщения: 11

Re: Определение своего ip средствами C

Сообщение grooz »

h8u, для того, чтобы получить имя хоста при помощи gethostname, надо его сначала задать при помощи sethostname, увы. :D В зависимости от дистрибутива, нужно прописать его либо в /etc/hostname, либо где-то ещё. Либо просто сделать из-под рута hostname blablabla.
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Определение своего ip средствами C

Сообщение d_Sun »

(grooz @ Пятница, 05 Августа 2005, 23:19) писал(а):h8u, для того, чтобы получить имя хоста при помощи gethostname, надо его сначала задать при помощи sethostname, увы. :D В зависимости от дистрибутива, нужно прописать его либо в /etc/hostname, либо где-то ещё. Либо просто сделать из-под рута hostname blablabla.


Ф десятку :thumbsup: Вообще если это приложение собираться стать клиентом/сервером tcp/udp то лучше ip и номер порта передавать через список аргументов командной строки.
Моя подпись сильно длинная :)
Спасибо сказали:
Ananas
Сообщения: 64

Re: Определение своего ip средствами C

Сообщение Ananas »

man gethostent (кстати тот-же ман, что и для gethostbyname)
Спасибо сказали: