firex
AutoIT Гуру
- Сообщения
- 943
- Репутация
- 208
AutoIt: 3.x
Версия: 0.0
Категория: Интернет, Сеть, Разное
Описание: Короткий пример осуществления передачи данных между клиентами.
Сделал очень давно, более не поддерживаю. Часть функционала не осуществлена в GUI.
Код/Пример:
Источник: autoit-script.ru
Автор(ы): Firex
Версия: 0.0
Категория: Интернет, Сеть, Разное
Описание: Короткий пример осуществления передачи данных между клиентами.
Сделал очень давно, более не поддерживаю. Часть функционала не осуществлена в GUI.
Код/Пример:
Код:
#NoAutoIt3Execute
Opt("TrayMenuMode",1)
Opt('WinWaitDelay', 5)
#Include <Array.au3>
#Include <Crypt.au3>
#Include <String.au3>
#Include <GUIEdit.au3>
#Include <NotifyBox.au3>
#Include <Constants.au3>
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <StaticConstants.au3>
OnAutoItExitRegister("cleanup")
; === StartCode
_GUI_Create()
Global $sSocks[1][4] = [[0]]
Global $sRecv = '', $sRead = ''
Global $sSocket = -1, $cSocket = -1, $nSocket = -1
Global $sParam[3] = ['port/max','1616',-1]
; === MainLoop
While 1
$hMsg = GUIGetMsg()
Switch $hMsg
Case $GUI_EVENT_CLOSE
If $sSocket <> -1 Then _
_FxB_Server_Close()
Exit 1488
Case $hDummy, $hButton[1] ;Послать сообщение
If ControlGetFocus($hGUI) = 'Edit2' Or $hMsg = $hButton[1] Then
$sRead = GUICtrlRead($hEdit[1])
GUICtrlSetData($hEdit[1],'')
If $sSocket <> -1 Then
_FxB_Server_Print('ADMIN', $sRead)
ContinueLoop
EndIf
_FxB_Client_Print($sRead)
EndIf
Case $hMenu[1] ;Создание сервера
_FxB_Server_Create()
Case $hMenu[2] ;Настройки сервера
_GUI_ServerSettings()
Case $hMenu[3] ;Отключение сервера
_FxB_Server_Close()
Case $hMenu[6] ;Настройки клиента
_GUI_ClientSettings()
Case $hMenu[7] ;Отключение клиента от сервера
_FxB_Client_Disconnect()
Case $hMenu[9] ;О чате
_FxB_ShowAbout()
Case $hButton[0] ;Подключиться к серверу
If $cSocket <> -1 Then
_FxB_Client_Disconnect()
ContinueLoop
EndIf
$sRead = GUICtrlRead($hEdit[0])
_FxB_Client_Connect(StringSplit($sRead,":"))
Case Else
If $sSocket <> -1 Then
$nSocket = TCPAccept($sSocket)
If $nSocket <> -1 Then
Local $u = $sSocks[0][0]+1
ReDim $sSocks[$u+1][4]
$sSocks[0][0] += 1
$sSocks[$u][3] = 0
$sSocks[$u][2] = _SocketToIP($nSocket)
$sSocks[$u][1] = $nSocket
$sSocks[$u][0] = $sSocks[$u][2]
_FxB_Server_Print('SERVER', $sSocks[$u][2] & ' подключен!',$u)
EndIf
$nSocket = -1
For $i = 1 To $sSocks[0][0] Step 1
$sRecv = TCPRecv($sSocks[$i][1], 16384)
If @Error Then _
_FxB_Server_RemoveClient($i)
If $sRecv <> '' Then _
_FxB_Server_Print($sSocks[$i][0], $sRecv, $i)
Next
ElseIf $cSocket <> -1 Then
$sRecv = TCPRecv($cSocket, 16384)
If @Error Then _
_FxB_Error('',@Error,'r0')
If $sRecv <> "" Then _
_FxB_LogPrint($sRecv)
EndIf
EndSwitch
WEnd
; === ServerFunctions
Func _FxB_Server_Create($iPort = '', $iPass = '')
TCPStartup()
$sSocket = TCPListen(@IPAddress1,$sParam[1])
If @Error Then _
Return _FxB_Error('',@Error,'s0')
_FxB_LogPrint('Сервер успешно создан!')
GUICtrlsSetState($GUI_ENABLE,$hMenu[3],$hButton[1], $hEdit[1])
GUICtrlsSetState($GUI_DISABLE,$hMenu[1],$hEdit[0],$hButton[0], $hMenu[2])
Return $sSocket
EndFunc
Func _FxB_Server_Close()
_FxB_Error('')
_FxB_LogPrint('Сервер успешно отключен!')
GUICtrlsSetState($GUI_DISABLE,$hMenu[3],$hButton[1], $hEdit[1])
GUICtrlsSetState($GUI_ENABLE,$hMenu[1],$hEdit[0],$hButton[0], $hMenu[2])
EndFunc
Func _FxB_Server_Print($iUser,$iMsg,$iSender=-1)
If $iMsg = '' Then _
Return _NotifyBox( 16, "", "Некорректное сообщение!")
Local $i, $fMsg = '|' & $iUser & '|: ' & $iMsg
_FxB_LogPrint($fMsg)
For $i = 1 To $sSocks[0][0] Step 1
If $i <> $iSender Then _
TCPSend($sSocks[$i][1], $fMsg)
If @Error Then _
_FxB_Server_RemoveClient($i)
Next
EndFunc
Func _FxB_Server_RemoveClient($index)
Local $temp = $sSocks[$index][0]
TCPCloseSocket($sSocks[$index][1])
_ArrayDelete($sSocks,$index)
$sSocks[0][0] -= 1
_FxB_Server_Print('SERVER', 'Участник ' & $temp & ' удален!')
EndFunc
; === ClientFunctions
Func _FxB_Client_Connect($sServer)
If UBound($sServer) <> 3 Then _
Return _FxB_Error(MsgBox( 16, "", "Некорректный адрес!"),-1,'b0')
Local $szIP
TCPStartup()
$szIP = TCPNameToIP($sServer[1])
If $szIP = "" Then _
Return _FxB_Error('',@Error,'c0')
Ping($szIP)
If @Error Then _
Return _FxB_Error('',-1,'p0')
$cSocket = TCPConnect($szIP, $sServer[2])
If @Error Then _
Return _FxB_Error('',@Error,'c1')
_FxB_LogPrint('Соединение с ' & $szIP & ' установлено!')
GUICtrlSetData($hButton[0],'Disconnect')
GUICtrlsSetState($GUI_ENABLE,$hMenu[7],$hButton[1], $hEdit[1])
GUICtrlsSetState($GUI_DISABLE,$hMenu[1],$hMenu[6], $hMenu[2])
Return $cSocket
EndFunc
Func _FxB_Client_Disconnect()
_FxB_Error('')
_FxB_LogPrint('Вы отключились от сервера!')
GUICtrlSetData($hButton[0],'Connect')
GUICtrlsSetState($GUI_DISABLE,$hMenu[7],$hButton[1], $hEdit[1])
GUICtrlsSetState($GUI_ENABLE,$hMenu[1],$hMenu[6], $hMenu[2])
EndFunc
Func _FxB_Client_Print($iMsg)
If $iMsg = '' Then _
Return MsgBox( 16, "", "Некорректное сообщение!")
_FxB_LogPrint('|YA <3|: ' & $iMsg)
TCPSend($cSocket, $iMsg)
If @Error Then _
Return _FxB_Error('',@Error,'s0')
Return 1
EndFunc
; === GlobalFunctions
Func _FxB_LogPrint($iMsg)
_GUICtrlEdit_AppendText($hEdit[2], $iMsg & @CRLF)
EndFunc
Func _FxB_Error($null, $wsa = -1, $api = -1)
If $wsa <> -1 Then _
GUICtrlSetData($hLabel[0],"WSA.Err: " & $wsa)
If $api <> -1 Then _
GUICtrlSetData($hLabel[1],"API.Err: " & $api)
If $sSocket <> -1 Then
TCPCloseSocket($sSocket)
For $i = 1 To $sSocks[0][0] Step 1
TCPCloseSocket($sSocks[$i][1])
Next
EndIf
If $cSocket <> -1 Then _
TCPCloseSocket($cSocket)
TCPShutdown()
$sSocket = -1
$cSocket = -1
Dim $sSocks[1][4] = [[0]]
Return -1
EndFunc
Func _FxB_ShowAbout()
_NotifyBox( 64, 'FxB - About', 'Author: Firex' & @LF & _
' Build: 2/2' & @LF & ' Version: 0.0/concept' & _
@LF & @LF & 'Development took an hour: 3')
EndFunc
; === GUI'sSection
Func _GUI_Create()
Global $hGUI, $hDummy, $hMenu[11], $hEdit[3], $hButton[2], $hLabel[2]
$hGUI = GUICreate("Chat FxB/lol - Server.Client v0.0", 386, 573, -1, -1, 0x94CA0000, 0x00000100)
$hLabel[0] = GUICtrlCreateLabel("WSA.Err: 0", 276, 18, 110, 18, $SS_LEFT)
$hLabel[1] = GUICtrlCreateLabel("API.Err: 0", 276, 34, 110, 18, $SS_LEFT)
$hEdit[0] = GUICtrlCreateEdit('', 56, 21, 130, 18, $ES_LEFT)
$hEdit[1] = GUICtrlCreateEdit('Сообщение...', 7, 493, 310, 50, 0x50200844 - 0x0800)
$hEdit[2] = GUICtrlCreateEdit("Build nightly Apr 30 2012." & @CRLF, 7, 57, 372, 428, 0x50200844)
$hButton[0] = GUICtrlCreateButton("Connect", 192, 20, 70, 20)
$hButton[1] = GUICtrlCreateButton("Send", 320, 523, 60, 20)
$hMenu[0] = GUICtrlCreateMenu("&Сервер")
$hMenu[1] = GUICtrlCreateMenuItem("&Создать", $hMenu[0])
$hMenu[2] = GUICtrlCreateMenuItem("&Настройки", $hMenu[0])
GUICtrlCreateMenuItem("", $hMenu[0], 3)
$hMenu[3] = GUICtrlCreateMenuItem("&Отключить", $hMenu[0])
$hMenu[5] = GUICtrlCreateMenu("&Клиент")
$hMenu[6] = GUICtrlCreateMenuItem("&Настройки", $hMenu[5])
GUICtrlCreateMenuItem("", $hMenu[6], 2)
$hMenu[7] = GUICtrlCreateMenuItem("&Отключиться", $hMenu[5])
$hMenu[10] = GUICtrlCreateMenu("&About" & MBytes(' ', 75))
$hMenu[9] = GUICtrlCreateMenuItem("&Chat FxB / lol version.",$hMenu[10])
GUICtrlCreateLabel("Сервер:", 7, 22, 45, 18, $SS_RIGHT)
GUICtrlCreateGroup("Подключение", 5, 5, 264, 46)
GUICtrlCreateGroup("", 271, 5, 108, 46)
GUICtrlSetFont($hLabel[0], 9, 400, 0, "Lucida Console")
GUICtrlSetFont($hLabel[1], 9, 400, 0, "Lucida Console")
$hDummy = GUICtrlCreateDummy()
Global $aAccelKeys[1][2] = [["{ENTER}", $hDummy]]
GUISetAccelerators($aAccelKeys)
GUICtrlsSetState($GUI_DISABLE,$hMenu[3],$hMenu[7],$hButton[1], $hEdit[1])
GUISetState(@SW_SHOW, $hGUI)
EndFunc
Func _GUI_ClientSettings()
Local $GUIpos, $hGUIClientSettings, $hMsg
$GUIpos = WinGetPos($hGUI, "")
$hGUIClientSettings = GUICreate('Client Settings', 320, 135, $GUIpos[0] + 100, $GUIpos[1] + 100, -1, -1, $hGUI)
GUISetState(@SW_DISABLE, $hGUI)
GUISetState(@SW_SHOW, $hGUIClientSettings)
While 1
$hMsg = GUIGetMsg()
Switch $hMsg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
GUISetState(@SW_ENABLE, $hGUI)
GUIDelete($hGUIClientSettings)
EndFunc
Func _GUI_ServerSettings()
Local $GUIpos, $hGUIServerSettings, $hMsg
$GUIpos = WinGetPos($hGUI, "")
$hGUIServerSettings = GUICreate('Server Control', 320, 135, $GUIpos[0] + 100, $GUIpos[1] + 100, -1, -1, $hGUI)
GUISetState(@SW_DISABLE, $hGUI)
GUISetState(@SW_SHOW, $hGUIServerSettings)
While 1
$hMsg = GUIGetMsg()
Switch $hMsg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
GUISetState(@SW_ENABLE, $hGUI)
GUIDelete($hGUIServerSettings)
EndFunc
; === ControlFunctions
; === InternalFunctions
Func MBytes($bytes, $count)
Local $r, $i
For $i = 1 To $count
$r &= $bytes
Next
Return $r
EndFunc
Func GUICtrlsSetState($state,$ctrl1,$ctrl2=0,$ctrl3=0,$ctrl4=0,$ctrl5=0)
Local $array[5] = [$ctrl1,$ctrl2,$ctrl3,$ctrl4,$ctrl5]
ReDim $array[@NumParams-1]
For $i = 0 To @NumParams-2
GUICtrlSetState($array[$i],$state)
Next
EndFunc
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), "int*", 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
Источник: autoit-script.ru
Автор(ы): Firex