Ich möchte Daten von PC A, nach PC B senden ... ich denke das geht am besten per TCP, denn dass soll nur im Intranet geschehen.
Ich habe mal aus den Beispielen von TCPRecv() den Server und TCPSend() den Client ein Programm geschrieben, dass senden und verschicken kann:
Fkt. zum senden und empfangen von TCP
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <Misc.au3>
Opt('MustDeclareVars', 1)
Opt("TrayAutoPause", 0) ; Keine Pause, bei Klick
Opt("TrayIconDebug", 1) ; zeige Debug
Example()
[/autoit] [autoit][/autoit] [autoit]func Example()
; Richte einige wiederverwendbare Informationen ein.
; Richte deine öffentliche IP Adresse (@IPAddress1) hier ein.
;local $IPADDRESS = TCPNameToIP("chrisx312")
local $szIPADDRESS = @IPAddress2
local $nPORT = 8763
local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $input, $knopf
local $msg, $recv, $SendenSocket, $IPADDRESS = "192.168.1.60", $IP_Accepted, $iTimerC, $iTimerS, $iTimerDiff = 5*1000
$IPADDRESS = InputBox("andere IP Adresse", "andere IP Adresse:", $IPADDRESS)
if @error or $IPADDRESS = "" then return false
; Startet den TCP Service
;==============================================
TCPStartup()
; Erstellt einen lauschenden Port.
; Benutzt deine IP Adresse und den Port 33891. (Oben angegeben)
;==============================================
$MainSocket = TCPListen($szIPADDRESS, $nPORT)
; Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet.
if $MainSocket = -1 then
MsgBox(4112, "Fehler", "Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet: " & @error)
exit
endif
; Erstellt eine GUI für Messages.
;==============================================
$GOOEY = GUICreate(@ComputerName & " (IP: " & $szIPADDRESS & ")", 300, 230)
$edit = GUICtrlCreateEdit("", 10, 10, 280, 180, $ES_READONLY)
$input = GUICtrlCreateInput("", 10, 200, 210, 20)
$knopf = GUICtrlCreateButton("senden", 230, 200, 60, 20)
GUISetState()
; Initialisiert eine Variable um eine Verbindung anzugeben
;==============================================
$SendenSocket = TCPConnect($IPADDRESS, $nPORT)
if $SendenSocket <> -1 then
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden gestartet" & @CRLF & GUICtrlRead($edit))
else
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden nicht gestartet" & @CRLF & GUICtrlRead($edit))
endif
$ConnectedSocket = TCPAccept($MainSocket)
if $ConnectedSocket <> -1 then
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen gestartet" & @CRLF & GUICtrlRead($edit))
else
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen nicht gestartet" & @CRLF & GUICtrlRead($edit))
endif
$iTimerC = $iTimerS = TimerInit()
While 1
$msg = GUIGetMsg()
;MsgBox(0, "", TimerDiff($iTimer) & "-" & $iTimer+$iTimerDiff & " = " & TimerDiff($iTimer) - ($iTimer+$iTimerDiff))
if $SendenSocket = -1 and TimerDiff($iTimerS) > $iTimerDiff then
$SendenSocket = TCPConnect($IPADDRESS, $nPORT)
$iTimerS = TimerInit()
if $SendenSocket <> -1 then
; Bekommt die IP des verbundenen Clients
;$IP_Accepted = SocketToIP($SendenSocket)
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden gestartet" & @CRLF & GUICtrlRead($edit))
else
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden nicht gestartet" & @CRLF & GUICtrlRead($edit))
endif
endif
; Wartet auf und akzeptiert eine Verbindung
;==============================================
if $ConnectedSocket = -1 and TimerDiff($iTimerC) > $iTimerDiff then
$ConnectedSocket = TCPAccept($MainSocket)
$iTimerC = TimerInit()
if $ConnectedSocket <> -1 then
; Bekommt die IP des verbundenen Clients
;$szIP_Accepted = SocketToIP($ConnectedSocket)
; GUI Message Schleife
;==============================================
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen gestartet" & @CRLF & GUICtrlRead($edit))
else
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen nicht gestartet" & @CRLF & GUICtrlRead($edit))
endif
elseif $ConnectedSocket <> -1 then
; Versucht Daten zu empfangen, bis zu 2048 bytes
;----------------------------------------------------------------
$recv = TCPRecv($ConnectedSocket, 2048)
; Wenn der Empfang mit @error fehlschlägt, dann hat sich der Socket getrennt.
;----------------------------------------------------------------
if @error then
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "empfangen beendet" & @CRLF & GUICtrlRead($edit))
$ConnectedSocket = -1
;exitloop
endif
; Aktualisiert das Input-Control mit dem, was wir empfangen haben.
;----------------------------------------------------------------
if $recv <> "" then GUICtrlSetData($edit, $IPADDRESS & " (sendet) " & $recv & @CRLF & GUICtrlRead($edit))
endif
; GUI beendet
;--------------------
if $msg = $GUI_EVENT_CLOSE then exitloop
; Nachricht senden
if $msg = $knopf or (_IsPressed("0D") and WinActive($GOOEY)) then
; Wir sollten Daten in $szData haben... Lasst uns versuchen, sie durch unseren verbundenen Socket zu versenden.
TCPSend($SendenSocket, GUICtrlRead($input))
; Wenn das Senden mit @error fehlgeschlagen ist, dann ist der Socket getrennt.
;----------------------------------------------------------------
if @error then
GUICtrlSetData($edit, $szIPADDRESS & " (sagt) " & "senden beendet/nicht gestartet" & @CRLF & GUICtrlRead($edit))
$SendenSocket = -1
;exitloop
else
if GUICtrlRead($input) <> "" then
GUICtrlSetData($edit, $szIPADDRESS & " (sendet) " & GUICtrlRead($input) & @CRLF & GUICtrlRead($edit))
GUICtrlSetData($input, "")
endif
endif
endif
wend
if $ConnectedSocket <> -1 then TCPCloseSocket($ConnectedSocket)
if $SendenSocket <> -1 then TCPCloseSocket($SendenSocket)
TCPShutdown()
endfunc ;==>Example
; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
;----------------------------------------------------------------------
func SocketToIP($SHOCKET)
local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
[/autoit] [autoit][/autoit] [autoit]$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
[/autoit] [autoit][/autoit] [autoit]Return $aRet
endfunc ;==>SocketToIP
Es funktioniert auch soweit gut!
Man kann Nachrichten versehen, mehr nicht.
Kann man das noch vereinfachen?
Das obige ist nur ein Test, ich möchte das Programm umschreiben, sodass PC A einen String (ca. 5kb) an PC B sendet. PC B kontrolliert diesen String und gibt eine kurze Antwort (8bytes) an PC A.
PC A läuft immer, PC B ist nicht immer an. PC A soll prüfen ob PC B an ist, wenn ja sendet es den String, falls nein eben nicht.
Das obige Skript möchte ich in der Form im schreiben. Macht das Sinn?
Gibt es noch eine bessere Möglichkeit?