Что нового

[Сеть, интернет] Как соединить отправку и принятие по TCP в одном скрипте?

Юрий

Новичок
Сообщения
82
Репутация
3
Доброго времени суток. Моя проблема заключается в том, что я никак не могу грамотно и без багов в роботе соединить в одном скрипте функции посылки данных через TCP и принятия. Вот мой код. Прошу опытных программистов исправить мои ошибки и написать в чём они заключаются. Заранее премного благодарен. :smile:
Код:
[code]#include <GUIConstantsEx.au3>

;==============================================
;==============================================
;SERVER!! Start Me First !!!!!!!!!!!!!!!
;==============================================
;==============================================

HotKeySet("^!d","sendto")
Example()

Func Example()
	; Set Some reusable info
	; Set your Public IP address (@IPAddress1) here.
	;	Local $szServerPC = @ComputerName
	;	Local $szIPADDRESS = TCPNameToIP($szServerPC)
	Local $szIPADDRESS = @IPAddress1
	Local $nPORT = 33891
	Local $MainSocket, $edit, $ConnectedSocket, $szIP_Accepted
	Local $msg, $recv

	; 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
	;==============================================
	GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200, 100, 100)
	$edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
	GUISetState()


	; Initialize a variable to represent a connection
	;==============================================
	$ConnectedSocket = -1


	;Wait for and Accept a connection
	;==============================================
	Do
		$ConnectedSocket = TCPAccept($MainSocket)
	Until $ConnectedSocket <> -1


	; Get IP of client connecting
	$szIP_Accepted = SocketToIP($ConnectedSocket)

	; GUI Message Loop
	;==============================================
	While 1
		$msg = GUIGetMsg()

		; GUI Closed
		;--------------------
		If $msg = $GUI_EVENT_CLOSE Then ExitLoop

		; 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 ExitLoop

		; convert from UTF-8 to AutoIt native UTF-16
		$recv = BinaryToString($recv, 4)

		; Update the edit control with what we have received
		;----------------------------------------------------------------
		If $recv <> "" Then GUICtrlSetData($edit, _
				$szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
	WEnd


	If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

	TCPShutdown()
EndFunc   ;==>Example

; Function to return IP Address from a connected socket.
;----------------------------------------------------------------------
Func sendto()
   $ConnectedSocket = -1

	;Attempt to connect to SERVER at its IP and PORT 33891
	;=======================================================
	$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

	; 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
			; InputBox for data to transmit
			$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")

			; We should have data in $szData... lets attempt to send it through our connected socket.
			; convert AutoIt native UTF-16 to UTF-8
			TCPSend($ConnectedSocket, StringToBinary($szData, 4))

			; If the send failed with @error then the socket has disconnected
			;----------------------------------------------------------------
			If @error Then MsgBox(64,."","error")
			EndIf
		 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   ;==>SocketToIP
[/code]
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Юрий чем вы руководствовались, выбирая раздел?

P.S. Какое-то наваждение, писать вопросы для начинающих в раздел Инструменты и помощь по AutoIt! :smile:
 

asdf8

Скриптер
Сообщения
564
Репутация
152
OffTopic:

Garrett [?]
Какое-то наваждение, писать вопросы для начинающих в раздел Инструменты и помощь по AutoIt

Возможно, вводит в заблуждение то, что в названии раздела присутствует - и помощь по AutoIt
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
ТС, ты и на русском с ошибками пишешь, куда уж понять твои комментарии на английском...
Ты что в скрипте сделать то хотел?
 
Автор
Юрий

Юрий

Новичок
Сообщения
82
Репутация
3
За грамматические ошибки прошу прощения. Написать я хотел скрипт который при нажатии hotkeys отправляет содержимое буфера обмена по порту 33891 на себя же а другой скрипт ловит. Хотя.... Просто выложите правильно написанную функцию посылки и приёма данных по TCP но в одном скрипте а не в двух разных, например. Мне это очень поможет)
P.S. нет ли какой-то литературы с последовательным обучением AutoIT? (не help-ов а именно каких-то обучалок)
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
C2H5OH [?]
ТС, ты и на русском с ошибками пишешь, куда уж понять твои комментарии на английском...
Это примеры из справки и видимо ТС собирался их соеденить...
Юрий [?]
который при нажатии hotkeys отправляет содержимое буфера обмена по порту 33891 на себя же а другой скрипт ловит
Могу отдать пример приемника-сервера. Своеобразный порт-форвардер.
 
Автор
Юрий

Юрий

Новичок
Сообщения
82
Репутация
3
Я приму любые примеры скриптов, в которых соединены функция отправки и приёма информации по сети через tcp. Мне просто нужен пример, хоть какими-то но с вышеописанными параметрами. :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
http://autoit-script.ru/index.php/topic,9556.msg63533.html

Там ниже с TCP скрипт от winstan.
 
Верх