Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Коннект

Ответить
Настройки темы
[решено] Коннект

Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: morgan1991
Дата: 15-02-2009
Помогите плиз сделать скрипт состоящий из клиента и сервера. Клиент состоит из окна и 6 кнопок по нажатию кнопки в зависимости от нажатой серверу отправляется символ а тот в свою очередь запускает функцию в зависимости от символа. Пытался делать сам но не конектит, только на локалке а на другой комп не конектит. + Конектиться он долже по паролю.

-------
Хочу научиться писать драйвера на с++


Отправлено: 15:37, 15-02-2009

 

Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Скажите пожалуйста, а можно ли передавать файлы от клиента к серверу?

-------
Хочу научиться писать драйвера на с++


Отправлено: 00:25, 05-04-2009 | #21



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

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


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


в справке TCPSend/TCPRecv сказано, что бинарные данные тоже поддерживаются - значит можно
... интересно, а чем простое копирование не устраивает?

Отправлено: 09:31, 06-04-2009 | #22


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Т.е. нужно превратить файл в бинарные данные, а потом обратно? А можно поподробнее?

-------
Хочу научиться писать драйвера на с++


Отправлено: 01:55, 09-04-2009 | #23


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Сделал такой скриптик,

Клиент делает следующее:
Код: Выделить весь код
$statdata = FileOpen ("14.txt", 16 );открываем файл в бинарном режиме
$ReadStatdata = FileRead($statdata);читаем файл
$HexStatdata=String ($ReadStatdata);переводим в шестнадцатиричный текст
FileClose ($statdata);закрываем файл
Потом передаём данные серверу, потом на сервере выполняем это:
Код: Выделить весь код
$BinStatdata=Binary ($HexStatdata);обратно переводим их шестнадцатиричного в бинарный
$statdata2 = FileOpen ("15.txt", 2+16);открываем файл в бинарном режиме + режим записи
FileWrite ( $statdata2, $BinStatdata);пишим в файл изменённые данные
FileClose ($statdata2);закрываем файл
Но как теперь реализовать процент загрузки? + Процент загрузки должен видеть только сервер.

-------
Хочу научиться писать драйвера на с++


Последний раз редактировалось morgan1991, 09-04-2009 в 15:25.


Отправлено: 15:12, 09-04-2009 | #24


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Цитата morgan1991:
Сделал такой скриптик, »
Не прокатил такой скрипт, через него можно передавать файлы только размером не более 250 к/байт.
Помогите пожалуйста, каким образом всётаки можно передать файл от клиента к серверу?

-------
Хочу научиться писать драйвера на с++


Отправлено: 16:17, 09-04-2009 | #25


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить 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


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Спасибо огромное, буду разбираться.

-------
Хочу научиться писать драйвера на с++


Отправлено: 15:36, 10-04-2009 | #27


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить PM | Цитировать


Скажите ещё пожалуйста, возможно ли сделать так чтобы к одному скрипту могли приконнектиться неограниченное колличество человек? + должна быть двух сторонняя связь... Возможно это очень сложно, тогда хотябы подскажите как это работает, а я уже сам постараюсь собрать программку.

-------
Хочу научиться писать драйвера на с++


Отправлено: 23:31, 11-05-2009 | #28


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить 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
Только вот эти функции для определения IP, не одна не работают:

Первая:
Код: Выделить весь код
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
Помогите пожалуйста разобраться с этими функциями. Почему они не работают? Я в DLL 0.
И ещё всётаки как сделать двухстороннюю связь не открывая второго порта? Это вне моего понимания, приведу пример:
сервер голосового чата Ventrilo установлен на компьютере IP адрес которого виден из вне, а клиент коннектится к серверу с компьютера IP адрес которого виден только из локальной сети, дак каким же образом они обмениваются данными если сервер физически не сможет приконнектиться к клиенту т.к. его IP адрес не виден из вне? примерно тоже самое хочется сделать на Autoit.
Заранее спасибо!

-------
Хочу научиться писать драйвера на с++


Последний раз редактировалось morgan1991, 13-05-2009 в 17:02.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:48, 13-05-2009 | #29


Аватара для morgan1991

Старожил


Сообщения: 398
Благодарности: 13

Профиль | Сайт | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Коннект

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Коннект к удаленному серверу 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




 
Переход