ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Узнать IP на C++
  #1  
Старый 06.08.2009, 16:48
Аватар для agrofyl2
agrofyl2
Познающий
Регистрация: 25.04.2008
Сообщений: 51
Провел на форуме:
146826

Репутация: 17
По умолчанию Узнать IP на C++

При тестировании моего тр... в общем моей программы, у меня возникла проблема: нужно было определить айпи-адрес клиента.
Определяю я его так:
Код:
//Получиние своего IP
void GetCurrentIP(char *host) {
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);// инициализируем socket'ы используя Ws2_32.dll для процесса
	char HostName[1024]; // создаем буфер для имени хоста    
	if(!gethostname(HostName, 1024)) // получаем имя хоста  
	{
		if(LPHOSTENT lphost = gethostbyname(HostName)) // получаем IP хоста, т.е. нашего компа
			strcpy(host,inet_ntoa(*((in_addr*)lphost->h_addr_list[0]))); // преобразуем переменную типа LPIN_ADDR в DWORD    
	}    
	WSACleanup();
}
Определять то он определяет, НО! при тесте обнаружилось, что, например, если у клиента АДСЛ, то он выдает 198.168.0.12 а не внешний айпи, как если бы у клиента был диалап.

Можно ли как-нибудь определить внешний адрес методами С++, не прибегая к стороннему серверу(я конечно могу заставить его подконнектится к моему скрипту, опр. айпишник, или, например, спарсить его с 2ip.ru, но это, как мне кажется, изврат).

Или, например, если заставить его приконнектится к опр.(моему) IP, а самому принять этот коннект, то как тогда определить адрес?
 
Ответить с цитированием

  #2  
Старый 06.08.2009, 18:03
Аватар для __mad
__mad
Участник форума
Регистрация: 04.11.2007
Сообщений: 103
Провел на форуме:
548128

Репутация: 104
По умолчанию

Если клиент за натом/роутером, то узнать реальный IP кроме как через внешний сервер - никак.

Да, и нету тут никакого изврата в парсе IP через внешний сервер.

Для того что бы узнать IP того кто к тебе приконектился смотри 2 переменную в функции accept, а точней поле sin_addr.s_addr в структуре addr.
 
Ответить с цитированием

  #3  
Старый 06.08.2009, 18:11
Аватар для altblitz
altblitz
Постоянный
Регистрация: 05.06.2009
Сообщений: 706
Провел на форуме:
2764047

Репутация: 759


Отправить сообщение для altblitz с помощью ICQ
По умолчанию

agrofyl2,
вопрос интересный.

пока не задумывался особо, не было в том нужды.
но похоже внешний адрес рутера придется определять сторонними методами.

по крайней мере, в ОС не видел реального своего АйПи, лишь 192.* (Вай-Фай)

Последний раз редактировалось altblitz; 06.08.2009 в 18:14..
 
Ответить с цитированием

  #4  
Старый 06.08.2009, 18:45
Аватар для mr.The
mr.The
Познавший АНТИЧАТ
Регистрация: 30.04.2007
Сообщений: 1,206
Провел на форуме:
4778940

Репутация: 1257


Отправить сообщение для mr.The с помощью ICQ
По умолчанию

тс, делаеш запрос на сайт типа _ttp://www.whatismyip.com/ и регуляркой выдираеш реальный ip. можно не регуляркой, тогда через жопу, но напорядок меньше весит. в любом случае - элементарно пишется. либо можно ещё проще - сделать страницу на фрихосте, которая будет говорить ip. тогда вообще просто
 
Ответить с цитированием

  #5  
Старый 06.08.2009, 21:58
Аватар для agrofyl2
agrofyl2
Познающий
Регистрация: 25.04.2008
Сообщений: 51
Провел на форуме:
146826

Репутация: 17
По умолчанию

Итак, все получилось.
У меня уже была написана команда, по которой клиент коннектится к опр. IP. И я получаю его IP как говорил __mad:

Код:
#include "iostream"
using namespace std;

#include <winsock2.h>
#pragma comment( lib, "ws2_32.lib" )

int port=2121;

int main() {
	cout << "Work" << endl;
	WSADATA wsd;
	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {
		cout << "WSAData initialize error" << endl;
		return 0;
	}
	
	SOCKET sClient, sServer;
    struct sockaddr_in localaddr, clientaddr;
    int iSize;

	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   
	if (sServer == SOCKET_ERROR)
    {
		cout << "Soket error" << endl;
        return 0;
    }
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(port);

    if (bind(sServer, (struct sockaddr *)&localaddr, sizeof(localaddr)) == SOCKET_ERROR)
    {
		cout << "Can't bind" << endl;
        return 1;
    }
    
    cout << "Bind OK" << endl;

    listen(sServer, 4);

    cout << "Listen OK" << endl;
	
	while(1) {
        iSize = sizeof(clientaddr);
        sClient = accept(sServer, (struct sockaddr *)&clientaddr, &iSize);
		if (sClient == INVALID_SOCKET)
        {        
			cout << "Accept filed" << endl;
            break;
        }
		cout << "Accept OK" << endl;
		cout << "Client IP: " << inet_ntoa(clientaddr.sin_addr) << endl;
                        //return 0;
	}
    closesocket(sServer);
	cout << "End" << endl;
	WSACleanup();
    return 0;
}
Еще не тестил(только локалхост), но думаю работает.
__mad'у спасибо!!! и вообще всем кто ответил
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать пароль к Internet Explorer ? B1t.exe АнтиАдмин 4 18.02.2009 23:36
Актуальная проблема хакеров(новичков),как узнать версию форума(вопрос) Taylorith Форумы 7 16.10.2006 01:34
Как узнать код доступа (СИ) novichok Болталка 5 20.02.2006 21:26



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ