Что нового

Извлечь массив IP адресов подключнных к серверу

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
имеется функция формирования адреса из подключенного клиента:

Код:
Func SOCKET2IP($SHOCKET)
	Local $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

	$a = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, "ptr", DllStructGetPtr($sockaddr), _
			"int_ptr", DllStructGetSize($sockaddr))
	If Not @error And $a[0] = 0 Then
		$a = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
		If Not @error Then $a = $a[0]
	Else
		$a = 0
	EndIf

	; release Struct not really needed as it is a local
	$sockaddr = 0

	Return $a
EndFunc


Т. к. не имеется описания к ней сложился вопрос, как передать эти данные в массив? Это нужно для отображения в списке подключённых клиентов. Ну или хотя бы подскажите где прочитать про функцию или куда копать)
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Описание функции на msdn, а что мешает результату сделать stringsplit если он возвращается строкой?
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Если я Вас правильно понял то
Код:
$a
возвращает значение подключённого к сокету клиента в виде IP адреса? Но если клиентов много, например их будет сотня, тогда будет тоже строка или массив?
Мне просто нужно вывести их в обычный Listview. Чтоб видеть кто подключён, а кто нет.
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
То есть ты не знаешь, что эта функция возвращает? Запусти и увидишь. Подозреваю, что будет 1 ip. getpeername требует себе висту или старше. Или может не извращаться и через netstat/wmi посмотреть?
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
sngr
Мне чем проще тем лучше...пожалуй предпочту через AUTOIT, у меня то стоит семерка но планируется его запускать на XP с этим будут сложности?


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

Я также буду Вам благодарен за ссылку на msdn, где есть описание функции...
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
getpeername, с вистой это я не туда поглядел. Что значит через AUTOIT? У языка нет средств для решения твоей проблемы. Ты либо вызываешь через dllcall системную функцию getpeername получая результат, либо системную утилиту netstat, которая в свою очередь вызывает системные функции и возвращает тебе результат работы.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Т. к. не имеется описания к ней сложился вопрос, как передать эти данные в массив? Это нужно для отображения в списке подключённых клиентов. Ну или хотя бы подскажите где прочитать про функцию или куда копать)

S1R1US,
Ваша проблема не в отсутствии описания к этой функции, не в плохом знании функций AutoIt, а в непонимании технологии работы с TCP/IP. Копайте в этом направлении.
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
C2H5OH
Я бы хотел разобраться, что нужно понять/прочитать, чтобы наступило просветление в моём вопросе?
Или есть такой вариант:
Код:
netstat -a -p tcp|find/I"ESTABLISHED">C:\established.txt
откуда уже можно будет брать списком инфу...но дело в том, что если это дело будет крутиться в цикле то файл не всегда будет доступен для чтения данных, а сделать это по команде подключения я не знаю как)
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Код:
#include 'array.au3'
$s_Read = ''
If Not RegRead('HKCU\Software\Sysinternals\TCPView','EulaAccepted') Then _
RegWrite('HKCU\Software\Sysinternals\TCPView','EulaAccepted','REG_DWORD',1);соглашаемся с лицензией
$i_PID = Run('Tcpvcon.exe -n', '', @SW_HIDE, 6)
If @error Then
	MsgBox(0,'','где Tcpvcon.exe?')
	Exit 1
EndIf
While 1
    $s_Read &= StdoutRead($i_PID)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($s_Read,'(?si)\]\s+(.*?)\r\n.*?State:\s+(\S+).*?Local:\s+(\S+).*?Remote:\s+(\S+)',3)
Dim $arr[1000][4]
$j=0
For $i=0 To UBound($str)-1	Step 4
	$arr[$j][0]=$str[$i]
	$arr[$j][1]=$str[$i+1]
	$arr[$j][2]=$str[$i+2]
	$arr[$j][3]=$str[$i+3]
	$j+=1
Next
ReDim $arr[$j][4]
_ArrayDisplay($arr)

Tcpvcon
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
sngr
Выдаёт ошибку:
Line 29:

ReDim $arr[$j][4]
ReDim $arr^ERROR

Error: Array variable subscript badly formatted :'(
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Run('Tcpvcon.exe -n', '', @SW_HIDE, 6) Tcpvcon.exe здесь лежит в папке со скриптом. Если у тебя он где-то ещё, указывай абсолютный путь.
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
Код:
#include <array.au3>
$s_Read = ''
$i_PID = Run(@ScriptDir & '\Tcpvcon.exe -n AutoIt3.exe' , '', @SW_HIDE, 6)
While 1
    $s_Read &= StdoutRead($i_PID)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($s_Read,'(?si)\]\s+(.*?)\r\n.*?State:\s+(\S+).*?Local:\s+(\S+).*?Remote:\s+(\S+)',3)
Dim $arr[1000][4]
$j=0
For $i=0 To UBound($str)-1  Step 4
    $arr[$j][0]=$str[$i]
    $arr[$j][1]=$str[$i+1]
    $arr[$j][2]=$str[$i+2]
    $arr[$j][3]=$str[$i+3]
    $j+=1
Next
ReDim $arr [$j][4]
_ArrayDisplay($arr)

Выводит массив из всех подключений, нужная мне информация содержится в Col3. Я думаю теперь его надо сравнить с другим массивом, из .ini чтобы можно было по ip адресам определять подключенных "клиентов". Правильно?


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

Пардон, всё проще...обнаружил, что при использовании без команды
Код:
-n
получаю сразу тот результат, который мне необходим.
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Код:
#include 'array.au3'
$s_Read = ''
If Not RegRead('HKCU\Software\Sysinternals\TCPView','EulaAccepted') Then _
RegWrite('HKCU\Software\Sysinternals\TCPView','EulaAccepted','REG_DWORD',1);соглашаемся с лицензией
$i_PID = Run('Tcpvcon.exe -n', '', @SW_HIDE, 6)
If @error Then
    MsgBox(0,'','где Tcpvcon.exe?')
    Exit 1
EndIf
While 1
    $s_Read &= StdoutRead($i_PID)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($s_Read,'Remote:\s+(\S+):',3)
_ArrayDisplay($str)

Кажет только ip удалённых машин.
 
Автор
S

S1R1US

скрипт мне запили!
Сообщения
50
Репутация
6
sngr
Странно но у меня ничего не происходит, запуск идёт затем скрипт некоторое время "думает" и выходит


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

sngr
Вообщем исправил Ваш пример под себя
Код:
#include <array.au3>
$s_Read = ''
If Not RegRead('HKCU\Software\Sysinternals\TCPView','EulaAccepted') Then _
RegWrite('HKCU\Software\Sysinternals\TCPView','EulaAccepted','REG_DWORD',1);соглашаемся с лицензией
$i_PID = Run(@ScriptDir & '\Tcpvcon.exe AutoIt3.exe', '', @SW_HIDE, 6)
If @error Then
    MsgBox(0,'','где Tcpvcon.exe?')
    Exit 1
EndIf
While 1
    $s_Read &= StdoutRead($i_PID)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($s_Read,'Remote:\s+(\S+)',3)
_ArrayDisplay($str)


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

Спасибо sngr & C2H5OH! Задача решена! :IL_AutoIt_1:
 
Верх