|
You last visited: Today at 19:47
Advertisement
TCP Server / Client problem
Discussion on TCP Server / Client problem within the AutoIt forum part of the Coders Den category.
07/13/2011, 19:11
|
#1
|
elite*gold: 226
Join Date: Apr 2008
Posts: 630
Received Thanks: 241
|
TCP Server / Client problem
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
|
#2
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
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
|
#3
|
elite*gold: 226
Join Date: Apr 2008
Posts: 630
Received Thanks: 241
|
Quote:
Originally Posted by lolkop
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
|
#4
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
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
|
#5
|
elite*gold: 226
Join Date: Apr 2008
Posts: 630
Received Thanks: 241
|
Quote:
Originally Posted by lolkop
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
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
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
|
#7
|
elite*gold: 226
Join Date: Apr 2008
Posts: 630
Received Thanks: 241
|
PHP Code:
#include <GUIConstantsEx.au3> Opt('MustDeclareVars', 1) Example() Func Example() ; Set Some reusable info ; Set your Public IP address (@IPAddress1) here. ; 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 & ")", 300, 200) $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 $szIP_Accepted = SocketToIP($ConnectedSocket) While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop $recv = TCPRecv($ConnectedSocket, 8192) 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($sockaddr, 3)) 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 is. We 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($ConnectedSocket, FileRead(@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
|
#8
|
elite*gold: 0
Join Date: Jul 2010
Posts: 475
Received Thanks: 130
|
Hey,
Ich möchte kurz hinzufügen, dass ich immer das selbe Problem hatte.
Mit
PHP Code:
Do $recv = TCPRecv($ConnectedSocket, 8192) 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:
PHP Code:
Func GetIPbyAdapterName($DisplayName=1) Global $GLOBAL_hConsole, $GLOBAL_hConsoleIn Global Const $tagIP_ADAPTER_INFO = "ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _ " UINT DhcpEnabled; ptr CurrentIpAddress; ptr IpAddressListNext; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _ "ptr GatewayListNext; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _ "ptr DhcpServerNext; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _ "int HaveWins; " & _ "ptr PrimaryWinsServerNext; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _ "ptr SecondaryWinsServerNext; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _ "DWORD LeaseObtained; DWORD LeaseExpires;" if $DisplayName=1 Then $DisplayName="Hamachi" Local $dll, $ret, $adapterBuffer, $adapterBuffer_pointer, $return, $adapter, $ptr, $TempDisplayName,$FoundIP $dll = DllOpen("Iphlpapi.dll") $ret = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", 0, "dword*", 0)
$adapterBuffer = DllStructCreate("byte[" & $ret[2] & "]") $adapterBuffer_pointer = DllStructGetPtr($adapterBuffer) $return = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", $adapterBuffer_pointer, "dword*", $ret[2]) $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $adapterBuffer_pointer) If Not @error Then Do $TempDisplayName = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\" & DllStructGetData($adapter, "AdapterName") & "\Connection", "Name") If $TempDisplayName = $DisplayName Then $FoundIP = DllStructGetData($adapter, "IpAddressListADDRESS") ExitLoop EndIf
$ptr = DllStructGetData($adapter, "Next") $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $ptr) Until @error EndIf
$adapterBuffer = "" $adapterBuffer_pointer = "" DllClose($dll) If $FoundIP = "" Then Return SetError(1, 0, "0.0.0.0") Return $FoundIP EndFunc ;==>GetHamachiIP
}
|
|
|
07/14/2011, 18:49
|
#9
|
elite*gold: 226
Join Date: Apr 2008
Posts: 630
Received Thanks: 241
|
Quote:
Originally Posted by V8II
Hey,
Ich möchte kurz hinzufügen, dass ich immer das selbe Problem hatte.
Mit
PHP Code:
Do
$recv = TCPRecv($ConnectedSocket, 8192)
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:
PHP Code:
Func GetIPbyAdapterName($DisplayName=1)
Global $GLOBAL_hConsole, $GLOBAL_hConsoleIn
Global Const $tagIP_ADAPTER_INFO = "ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _
" UINT DhcpEnabled; ptr CurrentIpAddress; ptr IpAddressListNext; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _
"ptr GatewayListNext; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _
"ptr DhcpServerNext; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _
"int HaveWins; " & _
"ptr PrimaryWinsServerNext; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _
"ptr SecondaryWinsServerNext; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _
"DWORD LeaseObtained; DWORD LeaseExpires;"
if $DisplayName=1 Then $DisplayName="Hamachi"
Local $dll, $ret, $adapterBuffer, $adapterBuffer_pointer, $return, $adapter, $ptr, $TempDisplayName,$FoundIP
$dll = DllOpen("Iphlpapi.dll")
$ret = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", 0, "dword*", 0)
$adapterBuffer = DllStructCreate("byte[" & $ret[2] & "]")
$adapterBuffer_pointer = DllStructGetPtr($adapterBuffer)
$return = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", $adapterBuffer_pointer, "dword*", $ret[2])
$adapter = DllStructCreate($tagIP_ADAPTER_INFO, $adapterBuffer_pointer)
If Not @error Then
Do
$TempDisplayName = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\" & DllStructGetData($adapter, "AdapterName") & "\Connection", "Name")
If $TempDisplayName = $DisplayName Then
$FoundIP = DllStructGetData($adapter, "IpAddressListADDRESS")
ExitLoop
EndIf
$ptr = DllStructGetData($adapter, "Next")
$adapter = DllStructCreate($tagIP_ADAPTER_INFO, $ptr)
Until @error
EndIf
$adapterBuffer = ""
$adapterBuffer_pointer = ""
DllClose($dll)
If $FoundIP = "" Then Return SetError(1, 0, "0.0.0.0")
Return $FoundIP
EndFunc ;==>GetHamachiIP
}
|
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
|
#10
|
elite*gold: 0
Join Date: Jul 2010
Posts: 475
Received Thanks: 130
|
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
|
#11
|
elite*gold: 226
Join Date: Apr 2008
Posts: 630
Received Thanks: 241
|
Quote:
Originally Posted by V8II
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?
|
|
|
 |
Similar Threads
|
Server/Client Problem
06/27/2011 - Minecraft - 4 Replies
Hallo Leute hab wieder mal ein Problem
Also ich spiele seit einer Weile Minecraft und habe gedacht, dass ich mir einen Server machen könnte. Server Software heruntergeladen, alles ''entpackt'' und Server personalisiert. Dann kam der erste Versuch und ich merkte, dass ich den Minecraft Client und Server nicht gleichzeitig laufen lassen kann:
Minecraft-an funzt
Server-zu
Minecraft-zu funzt
Server-an
|
SERVER UND CLIENT PROBLEM
12/09/2010 - Metin2 Private Server - 7 Replies
Mein Problem ist Server immer
"Du wirst mit dem Server verbunden"
Und client ich packe ganze zeit die root dateien ändere in der serverinfo.yp meine ip und speicher und dann packe ich nochmal aber da sind wieder die falschen ips eingetragen
|
TCP Server+Client Problem
02/20/2010 - AutoIt - 9 Replies
So ich wollte mal TCP ausprobieren:
Dafür hab ich nach Vorlage ein Client und ein Server erstellt!
Auf dem eigenen PC funktioniert das ja auch!
Nur was muss ich machen damit ich einem Freund, von dem ich die IP nicht weiß, aber er den Server offen hat, einen Text schicken kann?
Der Server:
Global Const $IP = @IPAddress1
Global Const $PORT = 31758
Global $mainsocket
|
server/client problem D:
02/08/2010 - Dekaron Private Server - 4 Replies
http://img708.imageshack.us/img708/9177/23657178.t h.jpg
any idea what might be the problem?
also when I start dekaron.exe it comes up and then just crashes...
D: any ideas?
|
Mannequin server DB client problem
11/25/2009 - EO PServer Hosting - 3 Replies
hye all my problem after im log out and restart server my pet star gone and also royalty loss.pleass figure this for me
|
All times are GMT +1. The time now is 19:48.
|
|