TCP Server / Client problem

07/13/2011 19:11 ouka#1
Server:

Code:
_server()
func _server()
TCPStartup() ; TCP wird initialisiert
$mainsocket = TCPListen("192.168.178.20", 4321) ; Den mainsocket erstellen
	While 1 ; Endlosschleife
	$acceptedSocket = TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen
		If $acceptedSocket <> -1 Then; Wenn $acceptedSocket ungleich -1 ist, ...
			$receivedData = TCPRecv($acceptedSocket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
			MsgBox(64, "Nachricht empfangen!", "Es wurde eine Nachricht empfangen: " & $receivedData)
		EndIf
	WEnd
	TCPCloseSocket($acceptedSocket)
EndFunc
Client:
Code:
$ip = InputBox("Test","IP eingeben","")
$port = "4321"
$x = InputBox("Test","testnachricht eingeben","")
TCPStartup() ; TCP wird initialisiert
$socket = TCPConnect($ip,$port) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socket" ab
If $socket = -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
    MsgBox(16, "Error", "Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
EndIf
$sendedBytes = TCPSend($socket,$x) ; Sendet den Text an unseren verbundenen Socket
If $sendedBytes = 0 Then ; Wenn der Rückgabewert von TCPSend(...) 0 ist, Fehlermeldung ausgeben
    MsgBox(16, "Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
EndIf
TCPCloseSocket($socket)
TCPShutdown()
Der erste test war erfolgreich am router wird das packet direkt zum lan adapter meines rechners geschickt, sobald ich mit dem client auf ok geklickt habe versendet er das packet, allerdings kriege ich in meiner msg box vom server nicht den inhalt der übertragenen daten :( sprich meine test nachricht kommt nicht an warum?! o.o
07/13/2011 19:37 lolkop#2
ersetzt man beide ips jeweils durch den localhost, wird der string fehlerfrei übertragen...

daraus folgt, das das problem nicht am script an sich liegt, sondern warscheinlich an deinen netzwerkeinstellungen.
07/13/2011 19:44 ouka#3
Quote:
Originally Posted by lolkop View Post
ersetzt man beide ips jeweils durch den localhost, wird der string fehlerfrei übertragen...

daraus folgt, das das problem nicht am script an sich liegt, sondern warscheinlich an deinen netzwerkeinstellungen.
Jepp ist mir auch aufgefallen ABER in meinem router ist es soweit richtig, ab und zu kommt tatsächlich auch was an, wenn ich es öfters probiere zb... kann es mit lagg problemen zusammen hängen? kann man da ne func für machen?
07/13/2011 20:13 lolkop#4
du könntest das ganze so gestalten, das es doppelt abgesichert wird.

(1)client ---string---> server
(2)server ---string---> client
wenn string korrekt dann
(3)client --- OK ---> server
sonst
springe zu (1)

wobei tcp das eig von sich aus machen sollte^^
07/13/2011 20:45 ouka#5
Quote:
Originally Posted by lolkop View Post
du könntest das ganze so gestalten, das es doppelt abgesichert wird.

(1)client ---string---> server
(2)server ---string---> client
wenn string korrekt dann
(3)client --- OK ---> server
sonst
springe zu (1)

wobei tcp das eig von sich aus machen sollte^^
Typisches hand hand schacke prinzip aber wieso kommt die verbindung zu stande aber es kommt der innhalt nicht immer an? sondern nen leeres feld :(
07/14/2011 14:36 lolkop#6
wie bereits erwähnt, sollte das tcp protokoll eigentlich dafür sorgen, das nicht verloren gehen kann.

ist auf einem der rechner eventuell eine art firewall / port-blocker eingerichtet, welche probleme verursachen könnte?
07/14/2011 16:46 ouka#7
PHP Code:
#include <GUIConstantsEx.au3>
Opt('MustDeclareVars'1)
Example()
Func Example()
    ; 
Set Some reusable info
    
Set your Public IP address (@IPAddress1here.
;    
Local $szServerPC = @ComputerName
;    Local $szIPADDRESS TCPNameToIP($szServerPC)
    
Local $szIPADDRESS = @IPAddress1
;~     @IPAddress1
    Local $nPORT 
33891
    Local $MainSocket
$GOOEY$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
    
;==============================================
    
$GOOEY GUICreate("My Server (IP: " $szIPADDRESS ")"300200)
    
$edit GUICtrlCreateEdit(""1010280180)
    
GUISetState()
    ; 
Initialize a variable to represent a connection
    
;==============================================
    
$ConnectedSocket = -1
    
;Wait for and Accept a connection
    
;==============================================
    Do
        
$ConnectedSocket TCPAccept($MainSocket)
    
Until $ConnectedSocket <> -1
    $szIP_Accepted 
SocketToIP($ConnectedSocket)
    While 
1
        $msg 
GUIGetMsg()
        If 
$msg $GUI_EVENT_CLOSE Then ExitLoop
        $recv 
TCPRecv($ConnectedSocket8192)
        If @
error Then ExitLoop
        
If $recv <> "" Then
            GUICtrlSetData
($edit$szIP_Accepted&" > "&$recv&@CRLF&GUICtrlRead($edit))
            
IniWrite(@ScriptDir&"/Oukaresvtcp.ini"$recv)
        EndIf
    
WEnd
    
If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
    
TCPShutdown()
EndFunc
Func SocketToIP
($SHOCKET) ; Function to return IP Address from a connected socket.
    
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($sockaddr3))
        If 
Not @error Then $aRet $aRet[0]
    Else
        
$aRet 0
    
EndIf
    
$sockaddr 0
    
Return $aRet
EndFunc   
;==>SocketToIP 
PHP Code:
Opt('MustDeclareVars'1)
Example()
Func Example()
    ; 
Set Some reusable info
    
;--------------------------
    
Local $ConnectedSocket$szData
    
Set $szIPADDRESS to wherever the SERVER isWe will change a PC name into an IP Address
;    Local $szServerPC = @ComputerName
;    Local $szIPADDRESS TCPNameToIP($szServerPC)
    
Local $szIPADDRESS "xxx.xxx.xxx.xxx"
    
Local $nPORT 33891
    
Start The TCP Services
    
;==============================================
    
TCPStartup()
    
$ConnectedSocket = -1
    $ConnectedSocket 
TCPConnect($szIPADDRESS$nPORT)
    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
        While 
1;Loop forever asking for data to send to the SERVER
;~             $szData InputBox("Data for Server", @LF & @LF "Enter data to transmit to the SERVER:")
;~             If @
error Or $szData "" Then ExitLoop; If they cancel the InputBox or leave it blank we exit our forever loop
            TCPSend
($ConnectedSocketFileRead(@ScriptDir&"/Oukatcp.ini")) ; We should have data in $szData... lets attempt to send it through our connected socket.
            If @
error Then ExitLoop ; If the send failed with @error then the socket has disconnected
            sleep
(5000)
        
WEnd
    
EndIf
EndFunc 

ich hab das mit den scripts jetzt so realisiert und funktioniert einwandfrei, wie kann ich das jetzt hinkriegen das er nicht den neuen inhalt hinzufügt, sondern den alten überschreibt? Haste dafür ne lösung?
07/14/2011 17:32 V8II#8
Hey,
Ich möchte kurz hinzufügen, dass ich immer das selbe Problem hatte.
Mit
PHP Code:
Do
 
$recv TCPRecv($ConnectedSocket8192)
Until $recv<>"" 
funktioniert es dann. Manchmal muss man die Funktion öfter ausführen, damit sie was gutes ausspuckt =).
Um sicher zu gehen, dass das Packet nicht wirklich leer ist, kannst auch noch Timer einbauen. In der Regel dauert der Codeabschnitt den ich gezeigt habe NIE länger als eine halbe Sekunde.

Viel Glück ;)


Edit: Auch wenn es schon geht, verwende meinen Codeabschnitt, denn deiner funktioniert zwar, ist jedoch (soweit ich mich nicht verlesen habe xD) etwas umständlicher und langsamer.

Edit2: Falls du mal i-was mit Tcp über hamachi oder Wippien oder so machst, aknnst du so die IP ganz leicht herausfinden:
}
07/14/2011 18:49 ouka#9
Quote:
Originally Posted by V8II View Post
Hey,
Ich möchte kurz hinzufügen, dass ich immer das selbe Problem hatte.
Mit
PHP Code:
Do
 
$recv TCPRecv($ConnectedSocket8192)
Until $recv<>"" 
funktioniert es dann. Manchmal muss man die Funktion öfter ausführen, damit sie was gutes ausspuckt =).
Um sicher zu gehen, dass das Packet nicht wirklich leer ist, kannst auch noch Timer einbauen. In der Regel dauert der Codeabschnitt den ich gezeigt habe NIE länger als eine halbe Sekunde.

Viel Glück ;)


Edit: Auch wenn es schon geht, verwende meinen Codeabschnitt, denn deiner funktioniert zwar, ist jedoch (soweit ich mich nicht verlesen habe xD) etwas umständlicher und langsamer.

Edit2: Falls du mal i-was mit Tcp über hamachi oder Wippien oder so machst, aknnst du so die IP ganz leicht herausfinden:
}
Jo hab ich auch herrausgefunden :) danke, du sag mal weißt du wie ich ne ini datei verschicken kann und zwar so das ein anderes autoit prog auf die verschickte ini permanent zugreifen kann aber der inhalt sich permanent auch verändern kann? bzw wie überschreib ich ne vorhandene ini datei mit der neuen?
07/14/2011 18:57 V8II#10
Hm,
ich denke am leichtesten geht es, wenn du die komplette .ini Datei auf der einen Seite mit FileRead ausliest, dann per TCP verschickst ( Damit das Empfängerprogramm erkennt, dass es die .ini ist, kannst du ja zum Beispiel den Text **inidatei** mitschicken, das Empfängerprogramm checkt ob **inidatei** in der angekommenen Nachricht steckt und handelt dementsprechend. Du brauchst dafür die Befehle Stringinstr und Stringreplace.)
und das Empfängerprogramm erstellt eine .ini und schreibt den empfangenen Text herein. Um eine vorhandene .ini zu überschreiben lasst du einfach die alte per FileDelete löschen.
07/14/2011 20:04 ouka#11
Quote:
Originally Posted by V8II View Post
Hm,
ich denke am leichtesten geht es, wenn du die komplette .ini Datei auf der einen Seite mit FileRead ausliest, dann per TCP verschickst ( Damit das Empfängerprogramm erkennt, dass es die .ini ist, kannst du ja zum Beispiel den Text **inidatei** mitschicken, das Empfängerprogramm checkt ob **inidatei** in der angekommenen Nachricht steckt und handelt dementsprechend. Du brauchst dafür die Befehle Stringinstr und Stringreplace.)
und das Empfängerprogramm erstellt eine .ini und schreibt den empfangenen Text herein. Um eine vorhandene .ini zu überschreiben lasst du einfach die alte per FileDelete löschen.
wenn ein script auf diese datei zugreift die er löschen möchte und neuschreiben mag, kann dann der script net abscheißen wenn er nen iniread ausführt indem moment wo die datei gelöscht wurde?