|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Коннект |
|
[решено] Коннект
|
![]() Старожил Сообщения: 398 |
Помогите плиз сделать скрипт состоящий из клиента и сервера. Клиент состоит из окна и 6 кнопок по нажатию кнопки в зависимости от нажатой серверу отправляется символ а тот в свою очередь запускает функцию в зависимости от символа. Пытался делать сам но не конектит, только на локалке а на другой комп не конектит. + Конектиться он долже по паролю.
|
|
------- Отправлено: 15:37, 15-02-2009 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Скажите пожалуйста, а можно ли передавать файлы от клиента к серверу?
|
------- Отправлено: 00:25, 05-04-2009 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать в справке TCPSend/TCPRecv сказано, что бинарные данные тоже поддерживаются - значит можно
... интересно, а чем простое копирование не устраивает? |
Отправлено: 09:31, 06-04-2009 | #22 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Т.е. нужно превратить файл в бинарные данные, а потом обратно? А можно поподробнее?
|
------- Отправлено: 01:55, 09-04-2009 | #23 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Сделал такой скриптик,
Клиент делает следующее: $statdata = FileOpen ("14.txt", 16 );открываем файл в бинарном режиме $ReadStatdata = FileRead($statdata);читаем файл $HexStatdata=String ($ReadStatdata);переводим в шестнадцатиричный текст FileClose ($statdata);закрываем файл Но как теперь реализовать процент загрузки? + Процент загрузки должен видеть только сервер. |
------- Последний раз редактировалось morgan1991, 09-04-2009 в 15:25. Отправлено: 15:12, 09-04-2009 | #24 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Цитата morgan1991:
Помогите пожалуйста, каким образом всётаки можно передать файл от клиента к серверу? |
|
------- Отправлено: 16:17, 09-04-2009 | #25 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата morgan1991:
сервер: Global $iSocket = 33890 Global $hSocket = -1 TCPStartup() $MainSocket = TCPListen("127.0.0.1", $iSocket, 1) If $MainSocket<0 Then Exit MsgBox(16, "TCP Error", "Unable to intialize socket.") $tsCTR = DllStructCreate("char Path[256];uint64 Size") ; управляющая структура копирования файла $izCTR = DllStructGetSize($tsCTR) ; размер структуры $ipCTR = DllStructGetPtr ($tsCTR) ; указатель $tbCTR = DllStructCreate("byte["& $izCTR &"]", $ipCTR) ; сериализованная структура (в бинарном виде) While 1 If $hSocket<0 Then $hSocket = TCPAccept($MainSocket) If $hSocket<0 Then ContinueLoop ; Получаем инфу о файле - назначение и размер $bData = Binary("") Do $bData &= TCPRecv($hSocket, 1, 1) If @error Then TCPCloseSocket($hSocket) $hSocket=-1 ConsoleWrite("Ошибка получения параметров файла! Операция отменена." &@CRLF) ContinueLoop 2 EndIf Until BinaryLen($bData)=$izCTR ; Считываем параметры DllStructSetData($tbCTR, 1, $bData) $sFile = DllStructGetData($tsCTR, "Path") $iFile = DllStructGetData($tsCTR, "Size") ; Создание файла $hFile = FileOpen($sFile, 2+16) If $hFile<0 Then TCPCloseSocket($hSocket) $hSocket=-1 ConsoleWrite("Ошибка создания файла! Операция отменена." &@CRLF) ContinueLoop EndIf ; Процесс копирования данных $bData = Binary("") $zData = 0 While $zData<$iFile $bData = TCPRecv($hSocket, 65536, 1) If @error Then TCPCloseSocket($hSocket) FileClose($hFile) ConsoleWrite("Соединение прервано! Операция отменена." &@CRLF) ContinueLoop 2 EndIf $zData += BinaryLen($bData) If FileWrite($hFile, $bData)=0 Or $zData>$iFile Then TCPCloseSocket($hSocket) FileClose($hFile) ConsoleWrite("Неустранимая ошибка при копировании! Операция отменена." &@CRLF) ContinueLoop 2 EndIf WEnd FileClose($hFile) ConsoleWrite("Файл успешно скопирован! ("& $sFile &")" &@CRLF) EndIf WEnd Global $hSocket = -1 Global $sServer = "127.0.0.1" Global $iServer = 33890 Global $sFileFrom = "d:\MyGame.ISO" ; файл-источник на клиенте (ЧТО) Global $sFileTo = "c:\InBox\YourGame.ISO" ; файл-приемник на сервере (КУДА) TCPStartup() _TCP_FileSend($sServer, $iServer, $sFileFrom, $sFileTo) TCPShutdown() Func _TCP_FileSend($server, $port, $FileFrom, $FileTo) Local $hSocket = TCPConnect($server, $port) If $hSocket = -1 Then Return SetError(1, 0, False) Local $hFile = FileOpen($FileFrom, 16) Local $zFile = FileGetSize($FileFrom), $bData, $zData If $hFile<0 Then Return SetError(3, 1, False) Local $tsCTR = DllStructCreate("char Path[256];uint64 Size") Local $izCTR = DllStructGetSize($tsCTR) Local $ipCTR = DllStructGetPtr ($tsCTR) Local $tbCTR = DllStructCreate("byte["& $izCTR &"]", $ipCTR) DllStructSetData($tsCTR, "Path", $sFileTo) DllStructSetData($tsCTR, "Size", $zFile) TCPSend($hSocket, DllStructGetData($tbCTR, 1)) If @error Then Return SetError(2, 1, False) Local $iProgress = 0 ProgressOn("Copy Progress", "Increments every 65536 bytes", "0 percent") While 1 $bData = FileRead($hFile, 65536) If @error<0 Then ExitLoop If @error>0 Then Return SetError(3, 2, False) $zData += BinaryLen($bData) TCPSend($hSocket, $bData) If @error Then Return SetError(2, 2, False) $iProgress = $zData/$zFile*100 ProgressSet($iProgress, StringFormat("Copied %-2i\% percent...", $iProgress)) WEnd ProgressOff() FileClose($hFile) TCPCloseSocket($hSocket) Return True EndFunc |
|
Отправлено: 13:42, 10-04-2009 | #26 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Спасибо огромное, буду разбираться.
|
------- Отправлено: 15:36, 10-04-2009 | #27 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Скажите ещё пожалуйста, возможно ли сделать так чтобы к одному скрипту могли приконнектиться неограниченное колличество человек? + должна быть двух сторонняя связь... Возможно это очень сложно, тогда хотябы подскажите как это работает, а я уже сам постараюсь собрать программку.
|
------- Отправлено: 23:31, 11-05-2009 | #28 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Додумался сам, вот что получилось:
Сервер: #include <GUIConstantsEx.au3> Global $IPAdress = @IPAddress1, $port = 3391, $ConnectedSocket[50], $szIP_Accepted, $i, $msg, $all_user = 50 TCPStartup() $MainSocket = TCPListen($IPAdress, $port) If $MainSocket = -1 Then Exit MsgBox(16, "error", "$MainSocket = " & $MainSocket) ; Create a GUI for messages ;============================================== $GOOEY = GUICreate("My Server (IP: " & $IPAdress & ")", 300, 200) $edit = GUICtrlCreateEdit("Мой сервер версия 1.0.0.1", 10, 10, 280, 180) GUICtrlSetState($edit, $GUI_DISABLE) GUISetState() For $i = 1 To $all_user - 1 Step + 1 $ConnectedSocket[$i] = -1 Next While 1 For $i = 1 To $all_user - 1 Step + 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then Exit If $ConnectedSocket[$i] = -1 Then $ConnectedSocket[$i] = TCPAccept($MainSocket) If $ConnectedSocket[$i] <> -1 Then GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " подключен") EndIf $recv = TCPRecv($ConnectedSocket[$i], 2048) If @error And $ConnectedSocket[$i] <> -1 Then $ConnectedSocket[$i] = -1 GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " отключен!") EndIf If $recv <> "" And Not @error Then GUICtrlSetData($edit, _ GUICtrlRead($edit) & @CRLF & "ID = " & $i & " IP = " & SocketToIP($ConnectedSocket[$i]) & " > " & $recv) Next WEnd Func SocketToIP($SHOCKET) Local $sockaddr, $aRet $sockaddr = DllStructCreate("short;ushort;uint;char[8]") $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _ "ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr)) If Not @error And $aRet[0] = 0 Then $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3)) If Not @error Then $aRet = $aRet[0] Else $aRet = 0 EndIf $sockaddr = 0 Return $aRet EndFunc ;==>SocketToIP #include <GUIConstantsEx.au3> Opt('MustDeclareVars', 1) Global $ConnectedSocket = -1, $szData Global $szIPADDRESS = "10.10.14.153" Global $nPORT = 3391 TCPStartup() $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT) If @error Then MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error) Else While 1 $szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:") If @error Or $szData = "" Then ExitLoop TCPSend($ConnectedSocket, $szData) If @error Then ExitLoop MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error) WEnd EndIf Первая: Func SocketToIP($SHOCKET) Local $sockaddr, $aRet $sockaddr = DllStructCreate("short;ushort;uint;char[8]") $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _ "ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr)) If Not @error And $aRet[0] = 0 Then $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3)) If Not @error Then $aRet = $aRet[0] Else $aRet = 0 EndIf $sockaddr = 0 Return $aRet EndFunc ;==>SocketToIP 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 ;==>SOCKET2IP И ещё всётаки как сделать двухстороннюю связь не открывая второго порта? Это вне моего понимания, приведу пример: сервер голосового чата Ventrilo установлен на компьютере IP адрес которого виден из вне, а клиент коннектится к серверу с компьютера IP адрес которого виден только из локальной сети, дак каким же образом они обмениваются данными если сервер физически не сможет приконнектиться к клиенту т.к. его IP адрес не виден из вне? примерно тоже самое хочется сделать на Autoit. Заранее спасибо! |
------- Последний раз редактировалось morgan1991, 13-05-2009 в 17:02. Отправлено: 16:48, 13-05-2009 | #29 |
![]() Старожил Сообщения: 398
|
Профиль | Сайт | Отправить PM | Цитировать Я сделал сам двух стороннюю связь с неограниченным колличеством клиентов.
Но так и не понял как же всётаки работают все сервера игр, icq, и т.п. ? В моём примере оба компьютера должны видеть IP адреса друг друга, если этого не происходит, то связь обрывается, т.к. двухсторонняя связь будет физически невозможна. И ещё вопросик такой, функции которые я приводил в пример не работают, почемуто. Ответьте ктонибудь пожалуйста, а то сам с собой разговариваю... ) Клиент: #include <GUIConstantsEx.au3> #include <Misc.au3> If _Singleton("connecter", 1) = 0 Then MsgBox(0, "Ошибка!", "Запуск двух копий программы запрещён!") Exit EndIf Global $ConnectedSocket = -1, $szData Global $szIPADDRESS = "89.108.114.19" Global $nPORT = 3391, $count_time = 0 TCPStartup() $MainSocket = TCPListen(@IPAddress1, 3392) If $MainSocket = -1 Then Exit MsgBox(16, "error", "$MainSocket = " & $MainSocket) $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT) If @error Then MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error) Exit Else TCPSend($ConnectedSocket, @IPAddress1) If @error Then Exit MsgBox(4112, "Error", "IP addres not sending WSA error: " & @error) Do $ConnectedSocket2 = TCPAccept($MainSocket) $count_time += 1 Until $ConnectedSocket2 <> -1 Or $count_time = 100 If $count_time > 99 Then Exit MsgBox(4112, "Error", "Время ожидания ответа от сервера истекло!") While 1 $szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:") If @error Or $szData = "" Then Exit TCPSend($ConnectedSocket, $szData) If @error Then Exit MsgBox(4112, "Error", "Error sending data WSA error: " & @error) WEnd EndIf #include <GUIConstantsEx.au3> Global $IPAdress = @IPAddress1, $port = 3391, $nPORT = 3392, $ConnectedSocket[50], $szIP_Accepted, $i, $msg, $all_user = 50 Global $szIPADDRESS[50], $ConnectedSocket2[50], $temp = 0 TCPStartup() $MainSocket = TCPListen($IPAdress, $port) If $MainSocket = -1 Then Exit MsgBox(16, "error", "$MainSocket = " & $MainSocket) ; Create a GUI for messages ;============================================== $GOOEY = GUICreate("My Server (IP: " & $IPAdress & ")", 300, 200) $edit = GUICtrlCreateEdit("Мой сервер версия 1.0.0.1", 10, 10, 280, 180) GUICtrlSetState($edit, $GUI_DISABLE) GUISetState() For $i = 1 To $all_user - 1 Step + 1 $ConnectedSocket[$i] = -1 Next $ii = 1 While 1 For $i = 1 To $ii Step + 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then Exit If $ii < $all_user Or $ii = $all_user Then If $ConnectedSocket[$i] = -1 Then $ConnectedSocket[$i] = TCPAccept($MainSocket) If $ConnectedSocket[$i] <> -1 Then While $temp = 0 $recv = TCPRecv($ConnectedSocket[$i], 2048) If @error Then $szIPADDRESS[$i] = "error" $temp = 1 EndIf If $recv <> "" Then $szIPADDRESS[$i] = $recv $temp = 1 EndIf WEnd If $szIPADDRESS[$i] <> "error" Then $ConnectedSocket2[$i] = TCPConnect($szIPADDRESS[$i], $nPORT) If @error Then TCPCloseSocket($ConnectedSocket[$i]) $ConnectedSocket2[$i] = -1 $ConnectedSocket[$i] = -1 GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "Связь с новым ID потеряна!") Else GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " подключен") $ii += 1 EndIf EndIf EndIf EndIf EndIf $recv = TCPRecv($ConnectedSocket[$i], 2048) If @error And $ConnectedSocket[$i] <> -1 Then $ConnectedSocket[$i] = -1 GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " отключен!") EndIf If $recv <> "" And Not @error Then GUICtrlSetData($edit, _ GUICtrlRead($edit) & @CRLF & "ID = " & $i & " IP = " & $szIPADDRESS[$i] & " > " & $recv) Next WEnd Func SocketToIP($SHOCKET) Local $sockaddr, $aRet $sockaddr = DllStructCreate("short;ushort;uint;char[8]") $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _ "ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr)) If Not @error And $aRet[0] = 0 Then $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3)) If Not @error Then $aRet = $aRet[0] Else $aRet = 0 EndIf $sockaddr = 0 Return $aRet EndFunc ;==>SocketToIP |
------- Последний раз редактировалось morgan1991, 14-05-2009 в 18:11. Отправлено: 16:59, 14-05-2009 | #30 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Коннект к удаленному серверу | Artem-Samsung | Вебмастеру | 1 | 13-08-2009 01:06 | |
[решено] Обрывается VPN подключение. Коннект с Win XP на Win server 2003 | _soldat_ | Microsoft Windows NT/2000/2003 | 3 | 06-12-2008 02:16 | |
[решено] [решено] медленный коннект к ftpd | pom3ec | Общий по FreeBSD | 11 | 17-11-2006 19:57 | |
Коннект с Инетом !!! | The Time | Microsoft Windows 95/98/Me (архив) | 1 | 06-05-2005 07:02 | |
Коннект по ФТП | byka | Сетевые технологии | 9 | 14-05-2004 00:18 |
|