Что нового

[Сеть, интернет] IP-адрес сервера

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Помогите получить IP-адрес сервера.
 

Вложения

  • 2014-12-28_080749.jpg
    2014-12-28_080749.jpg
    90.2 КБ · Просмотры: 42

ildar

Осваивающий
Сообщения
252
Репутация
30
Как то, так:
Код:
#include <Array.au3>
#include <Constants.au3>
#include <Encoding.au3>

$sRead = ''
 $iPID = Run(@ComSpec & ' /C ipconfig /all' , '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

    If Not $iPID Then
        MsgBox(16, 'Error', 'Error')
        Exit
    EndIf

    While 1
        $sRead &= StdoutRead($iPID)
        If @error Then ExitLoop
        Sleep(10)
		$sText = _Encoding_866To1251($sRead)
    WEnd

$sPattern = 'DHCP-сервер.*.?\s([0-9.]+)'
$aResult = StringRegExp($sText, $sPattern, 1)
_ArrayDisplay($aResult)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
если ip адрес белый, я бы посоветовал распарсить эту страницу: http://internet.yandex.ru/
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Оба варианта описанные выше, тоже показывают только мой адрес и адрес клиента. Адреса сервера нет, вопрос не решен.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Если я правильно понял, то все предложеные варианты будут возвращать IP-адрес компьютера или сети к которой подключен этот компьютер.
А автору нужно то, что возвращает системная команда nslookup имя сервера
 

ildar

Осваивающий
Сообщения
252
Репутация
30
IMStrelcov сказал(а):
Помогите получить IP-адрес сервера.
Я подумал нужен адрес DHCP-сервера. Адрес какого сервера нужен? Команда ipconfig /all выдает его?
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Все выше описанные способы и сайты показывают IP-адрес клиента (IP-адрес), он меняется при каждом подключении к интернету.
Команда ipconfig /all показывает тот-же адрес (IP-адрес)

IP-адрес автонастройки. . . . . . : 169.254.16.189
IP-адрес . . . . . . . . . . . . : 178.23.136.219
Маска подсети . . . . . . . . . . : 255.255.255.255
Основной шлюз . . . . . . . . . . : 178.23.136.219
DNS-серверы . . . . . . . . . . . : 195.58.224.34
195.58.229.228

Но в окне на рисунке выше есть еще IP-адрес сервера 195.58.224.226 по значению он не подходит не к одному показанных выше и при каждом подключении его значение не изменно.
Я в инете не силен, но по моим догадкам, IP-адрес сервера - это адрес моего провайдера.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
IMStrelcov,
Как-то пару лет назад разбирал RAS API. Сейчас проверил на WinXP 32, работает.
Код:
Opt('MustDeclareVars', 1)

Global Const $_RAS_API_WINVER = _RAS_API_Ver()

Global $aConnections, $sError, $sMyIP, $sServerIP

If Not _RAS_API_EnumConnections($aConnections, $sError) Then
	ConsoleWrite('Error _RAS_API_EnumConnections: ' & $sError & @LF)
	Exit 1
EndIf
If @extended Then
	ConsoleWrite('Name: ' & $aConnections[1] & @LF)
Else
	ConsoleWrite('Not Connections' & @LF)
	Exit 2
EndIf
If Not _RAS_API_GetProjectionInfo($aConnections[0], $sMyIP, $sServerIP, $sError) Then
	ConsoleWrite('Error _RAS_API_GetProjectionInfo: ' & $sError & @LF)
	Exit 3
EndIf
ConsoleWrite('My IP: ' & $sMyIP & @LF)
ConsoleWrite('Server IP: ' & $sServerIP & @LF)


Func _RAS_API_GetProjectionInfo($h_RasConn, ByRef $s_MyIP, ByRef $s_ServerIP, ByRef $s_Error)
	Local Const $tag_RASPPPIP = 'dword dwSize;dword dwError;char szIpAddress[16];char szServerIpAddress[16];dword dwOptions;dword dwServerOptions', _
			$_RASP_PppIp = 0x8021
	Local $t_RasPPPIP, $i_Size, $p_RasPPPIP, $a_Res

	$s_MyIP = ''
	$t_RasPPPIP = DllStructCreate($tag_RASPPPIP)
	$i_Size = DllStructGetSize($t_RasPPPIP)
	DllStructSetData($t_RasPPPIP, 'dwSize', $i_Size)
	$p_RasPPPIP = DllStructGetPtr($t_RasPPPIP)
	$s_Error = 'Error DllCall'
	$a_Res = DllCall('rasapi32.dll', 'dword', 'RasGetProjectionInfo', 'ptr', $h_RasConn, 'dword', $_RASP_PppIp, 'ptr', $p_RasPPPIP, 'int*', $i_Size)
	If @error Then Return False
	If $a_Res[0] Then
		$s_Error = _RAS_API_GetErrorString($a_Res[0])
		Return False
	EndIf
	$s_Error = 'Success'
	$s_MyIP = DllStructGetData($t_RasPPPIP, 'szIpAddress')
	$s_ServerIP = DllStructGetData($t_RasPPPIP, 'szServerIpAddress')
	Return True
EndFunc   ;==>_RAS_API_GetProjectionInfo

Func _RAS_API_EnumConnections(ByRef $a_Connections, ByRef $s_Error)
	Local $tagRASCONN = 'dword dwSize;hwnd hRasConn;char szEntryName[257];char szDeviceType[17];char szDeviceName[129];' & _
			'char szPhonebook[260];dword dwSubEntry;byte guidEntry[16];dword dwFlags;byte luid[8]', $t_REC, $t_SizeREC, $t_Num, $i_Tmp, $a_Res

	If UBound($a_Connections) <> 2 Then Dim $a_Connections[2]
	For $i = 0 To 1
		$a_Connections[$i] = ''
	Next
	If $_RAS_API_WINVER >= 0x0600 Then $tagRASCONN &= ';byte guidCorrelationId[16]'
	$t_REC = DllStructCreate($tagRASCONN)
	$i_Tmp = DllStructGetSize($t_REC)
	$t_SizeREC = DllStructCreate('dword dwSize')
	$t_Num = DllStructCreate('dword dwCount')
	DllStructSetData($t_REC, 'dwSize', $i_Tmp)
	DllStructSetData($t_SizeREC, 'dwSize', $i_Tmp)
	$s_Error = 'Error DllCall'
	$a_Res = DllCall('rasapi32.dll', 'dword', 'RasEnumConnections', 'ptr', DllStructGetPtr($t_REC), 'ptr', DllStructGetPtr($t_SizeREC), 'ptr', DllStructGetPtr($t_Num))
	If @error Then Return False
	If $a_Res[0] Then
		$s_Error = _RAS_API_GetErrorString($a_Res[0])
		Return False
	EndIf
	$s_Error = 'Success'
	$i_Tmp = DllStructGetData($t_Num, 'dwCount')
	If Not $i_Tmp Then Return True
	For $i = 0 To 1
		$a_Connections[$i] = DllStructGetData($t_REC, $i + 2)
	Next
	Return SetExtended($i_Tmp, True)
EndFunc   ;==>_RAS_API_EnumConnections

Func _RAS_API_GetErrorString($i_Error, $i_Flag = 1, $i_Del = 0)
	Local Static $a__Error[2]
	Local $a_Res, $s_Ret

	If Not $a__Error[1] Then
		$a__Error[0] = DllStructCreate('char[512]')
		$a__Error[1] = DllStructGetPtr($a__Error[0])
	EndIf
	$a_Res = DllCall('rasapi32.dll', 'dword', 'RasGetErrorString', 'uint', $i_Error, 'ptr', $a__Error[1], 'dword', 512)
	If @error Or $a_Res[0] Then
		If $i_Flag Then $s_Ret = 'Error GetErrorString'
	Else
		$s_Ret = DllStructGetData($a__Error[0], 1)
	EndIf
	DllStructSetData($a__Error[0], 1, '')
	If $i_Del Then
		For $i = 0 To 1
			$a__Error[$i] = 0
		Next
	EndIf
	Return $s_Ret
EndFunc   ;==>_RAS_API_GetErrorString

Func _RAS_API_Ver()
	Local $t_OSVI, $a_Res

	$t_OSVI = DllStructCreate('dword Size;dword MajorVersion;dword MinorVersion;dword BuildNumber;dword PlatformId;wchar CSDVersion[128]')
	DllStructSetData($t_OSVI, 'Size', DllStructGetSize($t_OSVI))
	$a_Res = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'ptr', DllStructGetPtr($t_OSVI))
	If (@error) Or (Not $a_Res[0]) Then Return 0
	Return BitOR(BitShift(DllStructGetData($t_OSVI, 'MajorVersion'), -8), DllStructGetData($t_OSVI, 'MinorVersion'))
EndFunc   ;==>_RAS_API_Ver
На Win7 32 смогу проверить примерно через час.
Win7 32 у меня работает.
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Благодарю, ваш код действительно рабочий и выдает нужный мне результат.


Добавлено:
Сообщение автоматически объединено:

Так же нашел кое что в др. теме
http://autoit-script.ru/index.php?topic=408.0
Вот Результат.
 

Вложения

  • 2014-12-28_114114.jpg
    2014-12-28_114114.jpg
    59.2 КБ · Просмотры: 26

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Есть еще команда "arp -a"но вбивать её нужно в cmd с правами админа, и она подойдет только для подтверждения существующего и заранее известного адреса
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,726
IMStrelcov

@IPAddress... - локальный (внутренний) адрес вашего компьютера, читай адрес сетевой карты, к которой подключена сеть. Если в компьютере присутствуют несколько сетевых карт, то их адреса будут, соответственно, в @IPAddress1, @IPAddress2 и т.д. В данном случае сеть реализуется через вторую сетевую карту, отсюда и @IPAddress2. Всякие "интернетометры", включая _GetIP(), показывают внешний адрес, т.е. тот, под которым вас видят в интернет. В случае "серых" IP (ваш компьютер находится за NAT провайдера) все это не имеет никакого смысла. А вот то, что вы хотите получить, это есть адрес VPN-сервера и имеет смысл только в том случае, если вы воткнули кабель непосредственно в сетевую карту компьютера, и при соответствующем типе подключения. Зачем оно вам нужно?
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
Зачем?
Может это и глупо, но для проверки связи под средством отправки пинга на этот адрес сервера.
Почему так?
Если отослать запрос на любой другой сайт, то ответа не может быть по трем причинам:
Нет соединение. (Комп. откл. от сети)
Запрос не был отослан. (Комп. подкл. к сети, но никакой сайт не возращает ответ)
Нет ответа от сайта. (Комп. подкл. к сети, но определенный сайт не возращает ответ)

А если отправлять пинг на адрес севера который я хотел получить, то в случае если нет ответа, я буду точно знать что проблема не в сайте, а в провайдере предоставляющем мне интернет услуги или если адрес сервера не определен, значит нет соединения.


Ну как то так. Думаю поймете что я хотел.
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
8.8.8.8 и 8.8.4.4 — это публичные серверы DNS от Google

А значит они могут быть не доступны по причине проблем на сервере Google, или при обрыве связи.
Для этого я все и затеял, что бы определить, произешел обрыв или же проблема на сайте.

То-есть:
Отсылаем пинг на YouTube, если нет ответа нужно узнать причину.
Отсылаем пинг на адрес сервера (ради которого вся эта канитель), если ответа нет, произешел разрыв связи с интернетом, но если ответ пришел значит проблема на YouTube.

Так понятней?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,726
IMStrelcov

Проблем с провайдером может быть на порядок больше чем с Google. Да хоть таже блокировка за неуплату ничего не покажет. Ну и кроме того, вариант пинга VPN-сервера является очень ограниченным решением. Например, если вы подключите роутер или смените провайдера с другим типом подключения, то предложенный здесь вариант не будет работать. В любом случае, я бы предложил лучше пинговать DNS провайдера, последовательно все (2 или 3), которые он предоставляет.

Если целью стоит определения наличия интернета, то в большинстве случаев _WinAPI_IsInternetConnected() более чем достаточно.
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Мне кажется это лишние телодвижения, наличие интернета можно проверить и проверкой связи с серверами времени, например pool.ntp.org
Код:
А значит они могут быть не доступны по причине проблем на сервере Google
это конечно жестко
OffTopic:
Вчера. Сосед рубится в какую то игру(сервер находится в Малайзии). Его жена смотрит телевизор. Жена: "Смотри, в Малайзии потоп, эвакуировано 120 тыс. человек."
Сосед не отрываясь от игры:"Да пофиг на этих 120 тыс. Лишь бы сервер не утонул....."
 
M

max1300

Гость
объясни суть своей проблемы по проще а то не понял когда читал :stars:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А значит они могут быть не доступны по причине проблем на сервере Google
IMStrelcov, Я думаю что вираятность ошибок в Google очень ниска или же вообще равна нулю.
 
Автор
IMStrelcov

IMStrelcov

CTPEJIbLLOB
Сообщения
259
Репутация
66
ildar сказал(а):
Мне кажется это лишние телодвижения, наличие интернета можно проверить и проверкой связи с серверами времени, например pool.ntp.org
Код:
А значит они могут быть не доступны по причине проблем на сервере Google
это конечно жестко

Жестко или нет, не важно, это за пример взято.
OffTopic:
Вчера. Сосед рубится в какую то игру(сервер находится в Малайзии). Его жена смотрит телевизор. Жена: "Смотри, в Малайзии потоп, эвакуировано 120 тыс. человек."
Сосед не отрываясь от игры:"Да пофиг на этих 120 тыс. Лишь бы сервер не утонул....."
 
Верх