Показать полную графическую версию : [решено] Коннект
morgan1991
15-02-2009, 15:37
Помогите плиз сделать скрипт состоящий из клиента и сервера. Клиент состоит из окна и 6 кнопок по нажатию кнопки в зависимости от нажатой серверу отправляется символ а тот в свою очередь запускает функцию в зависимости от символа. Пытался делать сам но не конектит, только на локалке а на другой комп не конектит. + Конектиться он долже по паролю.
Пытался делать сам но не конектит, только на локалке а на другой комп не конектит »
Поиграйте для начала готовыми примерами из справки для клиента (ф-ция TCPSend) и сервера (ф-ция TCPRecv). При запуске клиента на другом компе не забудьте задать $szIPADDRESS равным IP-адресу сервера (вместо макроса @IPAddress1).
morgan1991
16-02-2009, 17:45
Спасибо
morgan1991
05-03-2009, 16:56
Сделал так:
Сервер:
#RequireAdmin
;SERVER!! Start Me First !!!!!!!!!!!!!!!
#include <GUIConstants.au3>
; Set Some reusable info
; Set your Public IP address (@IPAddress1) here.
Dim $szIPADDRESS = @IPAddress1
Dim $nPORT = 33891
; Start The TCP Services
;==============================================
TCPStartUp()
; Create a Listening "SOCKET".
; Using your IP Address and Port 33891.
;==============================================
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
; If the Socket creation fails, exit.
If $MainSocket = -1 Then Exit
; Create a GUI for messages
;==============================================
; Initialize a variable to represent a connection
;==============================================
Dim $ConnectedSocket = -1
;Wait for and Accept a connection
;==============================================
Do
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
; Get IP of client connecting
Dim $msg, $recv
; GUI Message Loop
;==============================================
While 1
$msg = GUIGetMsg()
; GUI Closed
;--------------------
; Try to receive (up to) 2048 bytes
;----------------------------------------------------------------
$recv = TCPRecv( $ConnectedSocket, 2048 )
; If the receive failed with @error then the socket has disconnected
;----------------------------------------------------------------
If @error Then
TCPShutDown()
ShellExecute(@ScriptFullPath)
Exit
EndIf
; Update the edit control with what we have received
;----------------------------------------------------------------
If $recv <> "" Then seporate($recv)
WEnd
If $ConnectedSocket <> -1 Then TCPCloseSocket( $ConnectedSocket )
TCPShutDown()
Func seporate($reckkk)
If $recv = "test" Then test()
If $recv = "quit" Then quit()
EndFunc
Func SocketToIP($SHOCKET)
Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")
Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
"ptr",DLLStructGetPtr($sockaddr),"int_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
Func test()
MsgBox(16, "шгнеш", "гшшгшлршгр")
EndFunc
Func quit()
MsgBox(16, "шгнеш", "гшшгшлршгр")
EndFunc
Клиент:
;CLIENT! Start Me after starting the SERVER!!!!!!!!!!!!!!!
; see TCPRecv example
#include <GUIConstants.au3>
; Start The TCP Services
;==============================================
TCPStartUp()
; Set Some reusable info
;--------------------------
; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address
Dim $szIPADDRESS = InputBox("uuu", "Введите IP адрес сервера:")
Dim $nPORT = 33891
; Initialize a variable to represent a connection
;==============================================
Dim $ConnectedSocket = -1
;Attempt to connect to SERVER at its IP and PORT 33891
;=======================================================
$ConnectedSocket = TCPConnect($szIPADDRESS,$nPORT)
Dim $szData
; If there is an error... show it
If @error Then
MsgBox(4112,"Error","TCPConnect failed with WSA error: " & @error)
; If there is no error loop an inputbox for data
; to send to the SERVER.
Else
;Loop forever asking for data to send to the SERVER
While 1
; InputBox for data to transmit
$szData = InputBox("Data for Server",@LF & @LF & "Enter data to transmit to the SERVER:")
; If they cancel the InputBox or leave it blank we exit our forever loop
If @error Or $szData = "" Then ExitLoop
; We should have data in $szData... lets attempt to send it through our connected socket.
TCPSend($ConnectedSocket,$szData)
; If the send failed with @error then the socket has disconnected
;----------------------------------------------------------------
If @error Then ExitLoop
WEnd
EndIf
Дак вот как сделать так чтобы сервер мог тоже отвечать клиенту, а клиент как и сервер в зависимости от принятой команды выполнял определённую функцию?
morgan1991
09-03-2009, 20:55
насколько я понял можно просто в файл сервера воткнуть всё из файла клиента и наооборот, потом поменять имена переменных и порт, и получится двусторонняя связь.
Но вот такой вопросик как сделать чтобы клиент мог конектиться по паролю? Или хотябы скажите как сервер может отсоеденить клиента от себя? И ещё как сделать чтобы можно было с нескольких компов приконектиться к серверу одновреммено?
morgan1991
12-03-2009, 23:26
Так и не получилось у меня создать двустороннюю связь, помогите пожалуйста...
что то подсказывает, что это autoit-у тяжело дастят....не думал попробовать сделать на файлах?
к примеру все обращение передовать через ини или базу какую нить...
Так и не получилось у меня создать двустороннюю связь »
простой двусторонний чат на базе примера из справки:
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $szIPLocal = @IPAddress1
Local $szIPRemote = @IPAddress1
Local $LocalPort = 33892
Local $RemotePort = 33891
Local $MainSocket, $GOOEY, $InputSocket=-1, $OutputSocket=-1, $szIP_Accepted
Local $Bttn1, $Bttn2, $Edit1, $Edit2
Local $msg, $recv, $szData
TCPStartup()
$MainSocket = TCPListen($szIPLocal, $LocalPort)
If $MainSocket = -1 Then Exit
$GOOEY = GUICreate("My Server (IP: " & $szIPLocal & ")", 300, 250)
$Edit1 = GUICtrlCreateEdit("", 10, 10, 280, 180)
$Edit2 = GUICtrlCreateEdit("", 10, 190, 280, 20, 0)
$Bttn1 = GUICtrlCreateButton("Connect!", 10, 217, 120)
$Bttn2 = GUICtrlCreateButton("Send Text", 170, 217, 120)
GUISetState()
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
If $msg = $Bttn1 Then
If GUICtrlRead($Bttn1)="Connect!" Then
$OutputSocket = TCPConnect($szIPRemote, $RemotePort)
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
Else
GUICtrlSetData($Bttn1, "Disconnect!")
EndIf
Else
If $OutputSocket<> -1 Then TCPCloseSocket($OutputSocket)
$OutputSocket=-1
GUICtrlSetData($Bttn1, "Connect!")
EndIf
EndIf
If $msg = $Bttn2 Then
$szData = GUICtrlRead($Edit2)
If $OutputSocket<>-1 And $szData<>"" Then
TCPSend($OutputSocket, $szData)
GUICtrlSetData($Edit1, $szIPLocal &" > "& $szData & @CRLF & GUICtrlRead($Edit1))
EndIf
EndIf
$recv = TCPRecv($InputSocket, 2048)
If @error Then
$InputSocket = TCPAccept($MainSocket)
If $InputSocket <> -1 Then $szIP_Accepted = SocketToIP($InputSocket)
Else
If $recv<>"" Then GUICtrlSetData($Edit1, $szIP_Accepted &" > "& $recv & @CRLF & GUICtrlRead($Edit1))
EndIf
WEnd
If $InputSocket <> -1 Then TCPCloseSocket($InputSocket)
If $OutputSocket<> -1 Then TCPCloseSocket($InputSocket)
TCPShutdown()
EndFunc ;==>Example
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 ;==>SocketToIP
morgan1991
13-03-2009, 15:35
amel27, спасибо
morgan1991
14-03-2009, 21:58
Такая вот проблемка конектюсь к серверу, потом одновременно конектюсь с другого компа и у второго клиента с виду всё норм но на самом деле сервер его запросы не обрабатывает, а первый нормально работает. Дак вот такой вопросик: как сделать чтобы конектиться к серверу одновременно мог только один человек? И ещё как сервер может отсоеденить от себя клиент который уже приконектился?
morgan1991
15-03-2009, 14:06
И вот по ходу ещё вопросик возник:
Почему не передаются длинные значения? Например 40 слов разделённые "|". Каждое слово гдето из 8 символов. Это както можно поправить?
morgan1991
18-03-2009, 00:09
Или хотябы скажите ктонибудь как передать одномерный массив?
Почему не передаются длинные значения? »
тогда ж можно передовать по частям...
это к той прожке, что инфо собирает с компа собираетесь прикрутить?
если да - то гараздо проще на файлах.
даже стоит попробовать sql, если не ошибаюсь в udf-ах по ней есть.
morgan1991
18-03-2009, 08:33
это к той прожке, что инфо собирает с компа собираетесь прикрутить? »
нет...
даже стоит попробовать sql, если не ошибаюсь в udf-ах по ней есть. »
Пробовал с бд круить по хэлпу, но.... там стока всего...
По частям тоже не понятно, можно передавать номер части через |, но в это время серверу может передаться чёнить ещё, да и как сделать чтобы сервер ждал пока придёт определённая часть?
с серваками хз ))))
а вот на файлах думаю легко можно сделать, sql еще не смотрел, но как минимум тот же txt легко покатит )
morgan1991
18-03-2009, 15:48
а вот на файлах думаю легко можно сделать »
т.е. можно файлик передать?
А как?
Почему не передаются длинные значения? Например 40 слов разделённые "|". Каждое слово гдето из 8 символов. »странно - передал без проблем по сетке 100 слов по 9 букв с разделителем, т.е. 500 знаков :dont-know
Такая вот проблемка конектюсь к серверу, потом одновременно конектюсь с другого компа и у второго клиента с виду всё норм но на самом деле сервер его запросы не обрабатывает, а первый нормально работает. Дак вот такой вопросик: как сделать чтобы конектиться к серверу одновременно мог только один человек? »например так: сервер - создает сокет с очередью длинной 1 (3-й параметр TCPListen), принимает только первое соединение, открывает/закрывает только весь сокет целиком. Клиент - делает попытку коннекта и при успехе сразу делает попытку второго коннекта, забивая очередь... тогда любой "третий" получит "отлуп", пробовал - работает
morgan1991
18-03-2009, 17:38
странно - передал без проблем по сетке 100 слов по 9 букв с разделителем, т.е. 500 знаков »
сори, у меня ошибка была.
создает сокет с очередью длинной 1 (3-й параметр TCPListen) »
а если поставить 0, то будет конектиться только 1 человек? Или будет без ограничений?
если поставить 0, то будет конектиться только 1 человек? Или будет без ограничений? »
этот параметр влияет на длину очереди неподтвержденных запросов на соединение, а не на количество соединений... у меня получилось, что 0 и 1 дают одинаковую длину =1, т.е. если сервер подтверждает только один запрос (при этом он удаляется из очереди), все остальные будут падать в очередь до тех пор, пока она не заполнится, после этого все остальные попытки будут сервером отвергаться
мысль пришла - сервер может сам отрубить свою очередь таким же образом,
предыдущий вариант с ограничителем:
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Example()
Func Example()
Local $szIPLocal = @IPAddress1
Local $szIPRemote = @IPAddress1
Local $LocalPort = 33890
Local $RemotePort = 33891
Local $TempSocket, $MainSocket=-1, $GOOEY, $InputSocket=-1, $OutputSocket=-1, $szIP_Accepted
Local $Bttn1, $Bttn2, $Edit1, $Edit2
Local $msg, $recv, $szData
TCPStartup()
$GOOEY = GUICreate("My Server (IP: " & $szIPLocal & ")", 300, 250)
$Edit1 = GUICtrlCreateEdit("", 10, 10, 280, 180)
$Edit2 = GUICtrlCreateEdit("", 10, 190, 280, 20, 0)
$Bttn1 = GUICtrlCreateButton("Connect!", 10, 217, 120)
$Bttn2 = GUICtrlCreateButton("Send Text", 170, 217, 120)
GUISetState()
While 1
If $MainSocket = -1 Then $MainSocket = TCPListen($szIPLocal, $LocalPort, 1)
If $MainSocket <> 1 Then
If $InputSocket= -1 Then
$InputSocket = TCPAccept($MainSocket)
If $InputSocket <> -1 Then TCPConnect($szIPLocal, $LocalPort)
Else
$szIP_Accepted = SocketToIP($InputSocket)
$recv = TCPRecv($InputSocket, 2048)
If @error Then
TCPCloseSocket($InputSocket)
TCPCloseSocket($MainSocket )
$MainSocket = -1
$InputSocket= -1
Else
If $recv<>"" Then GUICtrlSetData($Edit1, $szIP_Accepted &" > "& $recv & @CRLF & GUICtrlRead($Edit1))
EndIf
EndIf
EndIf
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
If $msg = $Bttn1 Then
If GUICtrlRead($Bttn1)="Connect!" Then
$OutputSocket = TCPConnect($szIPRemote, $RemotePort)
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
Else
GUICtrlSetData($Bttn1, "Disconnect!")
EndIf
Else
If $OutputSocket<> -1 Then TCPCloseSocket($OutputSocket)
$OutputSocket=-1
GUICtrlSetData($Bttn1, "Connect!")
EndIf
EndIf
If $msg = $Bttn2 Then
$szData = GUICtrlRead($Edit2)
If $OutputSocket<>-1 And $szData<>"" Then
TCPSend($OutputSocket, $szData)
GUICtrlSetData($Edit1, $szIPLocal &" > "& $szData & @CRLF & GUICtrlRead($Edit1))
EndIf
EndIf
WEnd
If $InputSocket <> -1 Then TCPCloseSocket($InputSocket)
If $OutputSocket<> -1 Then TCPCloseSocket($InputSocket)
If $MainSocket <> -1 Then TCPCloseSocket($MainSocket)
TCPShutdown()
EndFunc ;==>Example
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 ;==>SocketToIP
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC