Что нового

[Сеть, интернет] Сервер TCP подключений с.1.0 к.1.1

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
AutoIt: 3.3.6.1
Версия сервера: 1.0
Версия клиента: 1.1
Категория: Интернет, Сеть, Файловая система.
Описание: Не простой сервер TCP подключений с расширенной настройкой и авторизацией (по желанию)
Содержимое данной темы скорее всего является примером, или рабочим проектом, может полезняшкой.
О написанном мною сервере: Иногда бывает, что необходимо иметь удаленный доступ к файлам и папкам на своем домашнем ПК, сидя например, на работе. Чтобы реализовать такую идею в своей программе (с интерфейсом, который Вам нравится) придется потратить часа 2 (минимум) за придумыванием и написанием "движка" (назовем его так). Кому лень тратить время на написание "движка", то можете взять его здесь.

По сути, это готовый сервер для авторизации, передачи файлов, листинга папок, может даже и для выполнения команд (Выключение, Перезагрузка и т.д...).

Функции этого "движка":
• Автоматическое прослушивание всех IP адресов машины, на котором запущен сервер (без ограничений, хоть их 10 будет). И даже, если Вы запустили сервер, а после подключили еще одно сетевое подключение, то в течении минуты сервер найдет его и начнет "прослушку" и на нем.
• Вызов отдельной пользовательской функции перед каждым действием (отправкой файла, принятием файла и т.д...). Для каждого события (принятие, отправка, листинг и т.д...) используются свои пользовательские функции. В этих пользовательских функциях Вы можете выполнять что угодно, но главное, Вы можете устанавливать условия, с помощью которых действие (например, отправка файла) будет выполнено, или отменено. Подробнее в файлах с расширением ".INC".
• Отправка файлов (или просто данных) с сервера - клиенту и наоборот.
• Удаление файлов на сервере.
• Получение MD5 хешей файлов сервера.
• Листинг файлов и папок в указанном каталоге сервера.
• Доступ к операциям с файлами после авторизации клиента.
• Своеобразная защита от атак: блокирует подключения с IP клиента на указанное кол-во секунд, если пользователь сделал определенное кол-во подключений в течении 1 минуты.
• Доступ к серверу из браузера (например, чтобы скачать свое приложение, с помощью которого Вы сможете оперировать файлами). Также, Вы можете отобразить страничку, текст.

Все эти (и не только эти) параметры можно легко настроить. Чтобы узнать "как?", читайте файл "Info.txt". В этом файле собраны все необходимые сведения для настройки этого сервера.
=========================================================================================
НАСТРОЙКА СЕРВЕРА (дополнительные файлы лежат в Server_Funcs)
Основные настройки сервера хранятся в файле Server.au3, в специальном блоке (участке файла, разделенный ------).
Детальная настройка (настройка событий) производится в папке Server_Funcs, в файлах с расширением ".INC".

Настройка событий по файлам:
Server_Authorization.inc = Авторизация (проверка имени пользователя, пароля и IP адреса клиента)
Server_FileDelete.inc = Контроль удаления файлов
Server_FileHash.inc = Контроль получения хешей файлов
Server_FilePut.inc = Контроль записи полученных файлов
Server_FileWrite.inc = Обработчик принятия и сохранения данных от клиента
Server_FileRead.inc = Обработчик отправки данных клиенту
Server_FileSend.inc = Контроль отправки файлов клиенту
Server_Listing.inc = Контроль получения списка папок и файлов

Server_HttpGet.inc = Обработчик команд HTTP сервера. При доступе к серверу из браузеров.
Server_LogWrite.inc = Обработчик логирования событий сервера

Другие (функциональные) файлы:
CheckLocalIP.mf = Функция проверки на наличие новых (непрослушиваемых сервером) IP адресов на локальной системе (где и работает сервер)
CheckUserLimit.mf = Функция контроля ограничений многократных подключений с одного IP адреса
GetAllIp.mf = Функция сбора всех доступных IP адресов локальной системы
SocketToIP.mf = Функция преобразования IP клиента из ID сокета клиента

FileDelete.mf = Функция удаления файлов
FileHash.mf = Функция получения хешей файлов
FilePutToServer.mf = Функция загрузки и записи файлов на сервер
FileWriteToServer.mf = Функция загрузки файлов на сервер
FileReadToClient.mf = Функция чтения файлов с сервера
FileSendToClient.mf = Функция загрузки файлов с сервера
Listing.mf = Функция листинга файлов и папок сервера

=========================================================================================
НАСТРОЙКА КЛИЕНТА (дополнительные файлы лежат в Client_Funcs)
Особых настроек для клиента нет, имеются лишь функции, которые Вы можете использовать в своих программах.

Другие (функциональные) файлы:
Authorization.inc = Функция подключения и авторизации клиента на сервере
FileDelete.inc = Функция удаления файлов с сервера
FileGet.inc = Функция загрузки и записи файлов с сервера
FileRead.inc = Функция загрузки файлов с сервера
FileHash.inc = Функция получения хешей файлов с сервера
FilePut.inc = Функция выгрузки и записи файлов на сервер
FileWrite.inc = Функция выгрузки файлов на сервер
Listing.inc = Функция листинга файлов и папок сервера


=========================================================================================
=========================================================================================
=========================================================================================
Неиспользуемые функции (СЕРВЕР)
Сервер собран так, что Вы можете отключать (закомментировать) функции, которые Вы не будете использовать.
Например, Вам не нужна функция Listing (отправка списка файлов и папок клиенту) и Вы хотите отключить ее.
Для этого Вам нужно закомментировать 3 строки в файле "Server.au3". Сами строки (для данного примера) перечислены ниже:
--------------------------------------------------------------------------------------------
#include "Server_Funcs\Listing.mf"; 7
#include "Server_Funcs\Server_Listing.inc"; 7
If $vData[1] = "List" Then _Listing($vData[2]); 7
--------------------------------------------------------------------------------------------
Для удобства, строки, которые принадлежат одной функции пронумерованы. В примере они имеют номер 7.
Строки с номером 0 в конце не следует отключать, т.к. они неоходимы серверу.


=========================================================================================
=========================================================================================
=========================================================================================
Неиспользуемые функции (КЛИЕНТ)
Сервер собран так, что Вы можете отключать (закомментировать) функции, которые Вы не будете использовать. А можете просто не добавлять их вообще.
Например, Вам не нужна функция Listing (получение клиентом списка файлов и папок сервера) и Вы хотите отключить ее.
Для этого Вам нужно либо закомментировать строку
#include "Client_Funcs\Listing.inc"; 7
, либо, вообще не включать ее в свой скрипт.
Как и в случае с сервером, все функции пронумерованы.
Строки с номером 0 в конце не следует отключать, т.к. они неоходимы клиенту.


=========================================================================================
=========================================================================================
=========================================================================================

Дополнительная информация о клиенте.
Клиентская часть этого "Рабочего примера" построена в виде отдельных функций. Для каждой функции используется один файл.
Вы можете включить файлы из папки "Client_Funcs" в свой скрипт как обычные UDF.

***********************************************************************************************************************************************
Автор: Astel064
Версия: 1.0
Выход: 18:32 30.08.2014


Файл: TcpServer.7z (во вложениях)

История версий:
1.0 (30.08.2014)
К.1.1 (05.09.2014): расширено логирование событий

Источник: autoit-script.ru
Автор: Astel064
Не спорю, довольно далековато до идеала, но я надеюсь, что кроме меня это будет кому-либо еще полезно.​
 

Вложения

  • TcpServer.7z
    11.5 КБ · Просмотры: 40

dremsama

Новичок
Сообщения
7
Репутация
0
Re: [Сеть, интернет] Сервер TCP подключений

Надеюсь, что обсуждение возможно.
В итоге, еще без упорного раскуривания, я получаю при старте примеров один и тот же результат при попытке сделать хоть что-то после логина: 1 = сервер отключился, хотя он очевидно работает.
Автор, дайте пожалуйста свой комментарий, ЧТЯДНТ?
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: [Сеть, интернет] Сервер TCP подключений

dremsama [?]
Надеюсь, что обсуждение возможно.
Конечно возможно :smile:

В итоге, еще без упорного раскуривания, я получаю при старте примеров один и тот же результат при попытке сделать хоть что-то после логина: 1 = сервер отключился, хотя он очевидно работает.Автор, дайте пожалуйста свой комментарий, ЧТЯДНТ?
Хм, очень странно, может Вы ID сокета (параметр $hSocket) неправильно указываете? Функция _Authorization его как раз возвращает.
Код:
#include "Client_Funcs\Authorization.inc"; 0
#include "Client_Funcs\FilePut.inc"; 3
#include "Client_Funcs\FileDelete.inc"; 5

; Создаем временный файл на локальном ПК лоя его отправки на сервер
$hFile = FileOpen(@ScriptDir&"\File.tmp", 2)
    If $hFile = -1 Then Exit MsgBox(16,"Создать файл на этом ПК","Не удалось создать файл на этом ПК, чтобы отправить его на сервер")
FileWrite($hFile, "Мой текст файла, который отправится на сервер..." )
FileClose($hFile)

; Подключаемся к серверу
$hServerSocket = _Authorization("127.0.0.1", "5102", "User", "Password")
    If @Error Then Exit MsgBox(0,"Ошибка авторизации","Код ошибки: "&@Error)+FileDelete(@ScriptDir&"\File.tmp")

; Отправляем на сервер ранее созданный временный файл
_FilePut($hServerSocket, @ScriptDir&"\File.tmp", "/File1.tmp")
    If @Error Then Exit MsgBox(0,"Ошибка отправки файла","Код ошибки: "&@Error)+TCPCloseSocket($hServerSocket)+FileDelete(@ScriptDir&"\File.tmp")
    MsgBox(64,"Отправка файла","Успех")

; Удаляем временный файл с локального ПК
FileDelete(@ScriptDir&"\File.tmp")

; Удаляем временный файл с серверного ПК
_FileDelete($hServerSocket, "/File1.tmp")
    If @Error Then
    Exit MsgBox(0,"Ошибка удаления файла","Код ошибки: "&@Error)+TCPCloseSocket($hServerSocket)
    Else
    MsgBox(64,"Удаление файла","Успех")
    EndIF

; Закрываем соединение с сервером
TCPCloseSocket($hServerSocket)
Exit 0


Если эта функция не выдаст ошибку, то дайте код Вашего проблемного скрипта...
Еще один вариант, когда сервер выкидывает клиента: в случае ошибки внутри функции передачи данных, сервер отключит клиента, чтобы отменить передачу и не тратить время на передачу ошибок и их обнаружение клиентом. Но _FileDelete не имеет такой возможности, т.к. она возвращает клиенту некий "код", описывающий, что вообще такое.
Еще один момент: почти все клиентские функции снабжены механизмом логирования событий. Чтобы включить логирование, ищите строку (например, в FileDelete.inc)
Код:
Local Const $fDebug=0
, и установите $fDebug равной 1. В этом случае, все данные лога будут выводиться в консоль.
 

dremsama

Новичок
Сообщения
7
Репутация
0
Re: [Сеть, интернет] Сервер TCP подключений

Astel064 сказал(а):
Еще один момент: почти все клиентские функции снабжены механизмом логирования событий. Чтобы включить логирование, ищите строку (например, в FileDelete.inc)
Код:
Local Const $fDebug=0
, и установите $fDebug равной 1. В этом случае, все данные лога будут выводиться в консоль.

Речь идет о Вашем примере сервера и клиента, они же Server.au3 и Client (Программа).au3
В них я еще ничего не менял :smile:
После установки дебага ситуация слегка прояснятся:
Итак, консоли:

клиент:
Func _Authorization(192.168.0.88, 5102, User, Password)
ServerName=192.168.0.88
ServerIP=192.168.0.88
Aut Extended (Y):
Return SetError (0,0,560)
GetData: Y
Func _FileHash(560, Client (Пример).au3)
TCPRecv Error: 10054
Func _FileHash(560, Client (Пример).au3)
TCPSend Error: 10038
>Exit code: 0 Time: 44.43

сервер
00-51-58 TCPListen(192.168.0.88, 5102); OK!
00-51-58 TCPListen(127.0.0.1, 5102); OK!
00-52-14 >Client (192.168.0.48) connected to ip 192.168.0.88 (ConnNum: 1/6)
00-52-14 >Client (192.168.0.48) is authorized (User)!
00-52-14 TCPCloseSocket(1464); OK!
00-52-14 TCPCloseSocket(1468); OK!
00-52-14 TCPCloseSocket(1456); CANSEL!
00-52-14 Cmd[1]=List; Cmd[2]=
00-52-14 Listing folder (C:\Documents and Settings\admin\Рабочий стол\server\) OK!
00-52-14 Client Disconnected! Shutdown process...
00-52-14 TCPCloseSocket(1456); OK!

Как видно, клиент проходит авторизацию и получает листинг, после чего дисконектится.
Сам же клиент на дальнейшие запросы возвращает логичные ошибки - WSAECONNRESET и на все последующее 10038.
Для меня не однозначно, почему происходит отвал клиента - судя по всему сервер просто дисконектит клиента и закрывает сокет...
OffTopic:

Единственное возможное расхождение в наших с Вами Includах - IniVirtualSPE.au3 которого у меня не было и который я откуда-то скачал. На всякий случай прикладываю - вдруг (хотя и маловероятно) в нем все дело.
 

Вложения

  • IniVirtualSPE.au3
    9.4 КБ · Просмотры: 9
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: [Сеть, интернет] Сервер TCP подключений

dremsama [?]
Единственное возможное расхождение в наших с Вами Includах - IniVirtualSPE.au3 которого у меня не было и который я откуда-то скачал. На всякий случай прикладываю - вдруг (хотя и маловероятно) в нем все дело.

Хм, если Вы не возражаете, я завтра добавлю в сервер и клиент более детальное логирование (нужно знать, на каком именно TCPSend сервер (или клиент) отключает (или отключается)).
А так, для меня до сей поры остается загадкой, почему такое происходит, может это какая-нибудь особенность системы (точнее ее компонента).

А у Вас брандмауэр выключен? Может он блокирует?
 

dremsama

Новичок
Сообщения
7
Репутация
0
Re: [Сеть, интернет] Сервер TCP подключений

Astel064 сказал(а):
А так, для меня до сей поры остается загадкой, почему такое происходит, может это какая-нибудь особенность системы (точнее ее компонента).

А у Вас брандмауэр выключен? Может он блокирует?

Брандмауер у меня если только дефолтный... но на обоих сторонах погашен как служба.

Я полагаю, клиент дисконектится, потому что выполняется следующее условие:

Код:
$vData = TCPRecv($hUserSocket, 1048576, 1)
	If @Error Then
	   ;ConsoleWrite (@Error&@CRLF) - мой вброс, в исходном коде этого нет.
	_Server_LogWrite("Client Disconnected! Shutdown process..."&@CRLF)
	Exit
	EndIF

@Error в этот момент равен -1
Однако почему... Могу pcap собрать трафик, если нужно.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Re: [Сеть, интернет] Сервер TCP подключений

dremsama [?]
@Error в этот момент равен -1Однако почему... Могу pcap собрать трафик, если нужно.

Да, это было-бы полезно


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

dremsama, уважаемый, я добавил логирование, прошу Вас протестировать и прислать мне логи :smile:
 

dremsama

Новичок
Сообщения
7
Репутация
0
Итак, логи.
Клиент:
Func _Authorization(192.168.0.88, 5102, User, Password)
ServerName=192.168.0.88
ServerIP=192.168.0.88
Aut Extended (Y):
Return SetError (0,0,592)

Func _Listing(592, )
GetData ok (Y)
Listing ok!; Return SetError(0,0,$sOutData)

Func _FileHash(592,
ClientStart.cmd)
TCPRecv Error: 10054; Return SetError(1,2,0)

Func _FileHash(592,
ClientStart.cmd)
TCPSend Error: 10038; Return SetError(1,1,0)

PCAP во вложении (переименуйте в .pcapng)
 

Вложения

  • pcap.png
    1.9 КБ · Просмотры: 11
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
dremsama [?]
Func _FileHash(592,
ClientStart.cmd)
TCPRecv Error: 10054; Return SetError(1,2,0)

Func _FileHash(592,
ClientStart.cmd)
TCPSend Error: 10038; Return SetError(1,1,0)

Тут видно, что имя файла начинается с новой строки, этого быть не должно. Может из-за этого? Попробуйте так прочитать хеш файла:
Код:
$hServer = _Authorization("192.168.0.88", 5102, "User", "Password")
$vHash = _FileHash($hServer, "ClientStart.cmd")
	If @Error Then
	MsgBox(16,"Ошибка","Ошибка (код): "&@Error)
	Exit
	EndIF
MsgBox(64,"Результат",$vHash)
TCPCloseSocket($hServer)
 

dremsama

Новичок
Сообщения
7
Репутация
0
Astel064 сказал(а):
dremsama [?]
Func _FileHash(592,
ClientStart.cmd)
TCPRecv Error: 10054; Return SetError(1,2,0)

Func _FileHash(592,
ClientStart.cmd)
TCPSend Error: 10038; Return SetError(1,1,0)

Тут видно, что имя файла начинается с новой строки, этого быть не должно. Может из-за этого? Попробуйте так прочитать хеш файла:

Таким образом все работает. Я полагаю, однако, что проблема не только в этом, т.к
Код:
Func _Listing(560, ) 
TCPRecv Error: 10054; Return SetError(1,2,0)

Обновление списка не имеет подобных аргументов, но все равно приводит к прерыванию.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
dremsama [?]
Обновление списка не имеет подобных аргументов, но все равно приводит к прерыванию.
А что пишет сервер в этот момент?
 

dremsama

Новичок
Сообщения
7
Репутация
0
@Astel064
Astel064 сказал(а):
dremsama [?]
Обновление списка не имеет подобных аргументов, но все равно приводит к прерыванию.
А что пишет сервер в этот момент?

Прошу прощение за долгое молчание, но проблема прояснилась.
Дело в том, что это известный баг TCPRecv - https://www.autoitscript.com/trac/autoit/ticket/2596

Самое простое решение - AutoItSetOption("TCPTimeout", 500)
Думаю, это не повредит и Вашему серверу. :smile:

Спасибо за Ваш труд!
 
Верх