|
You last visited: Today at 16:25
Advertisement
TCP Chat Hilfe/Tipps
Discussion on TCP Chat Hilfe/Tipps within the AutoIt forum part of the Coders Den category.
06/01/2014, 18:05
|
#1
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
TCP Chat Hilfe/Tipps
Hi, ich hoffe das gehört hier hin
Ich habe damit angefangen mich mit Autoit auseinander zu setzen und einen "Chat" wenn man es so nennen will geschrieben. Ich habe das Gefühl dass ich es sehr umständlich und nicht so geschrieben habe wie man das vielleicht machen sollte. Ich fände es ziemlich cool von euch wenn ihr mir helfen könntet wie ich das ganze "professioneller" aufbauen kann. Ich habe vor Autoit richtig zu lernen und nicht nur Spaghetticode zu produzieren.
Alles was ihr mir an Tipps gebt nehme ich gerne an
Ich hoffe das ist nicht zu ungenau.. ich bin kein totaler Anfänger auf dem Gebiet aber eben mit Autoit.
Vielen Dank schon mal
Server:
Code:
;Server
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $ipClient, $port
$ipClient= "XXXXXXXX"
$port= ""
HotKeySet("{ESC}","_stopp")
; GUI SETTINGS
GUICreate("Server",300,200)
$StartButton = GUICtrlCreateButton("Start",10,10)
$InputLabel = GUICtrlCreateInput("",10,50, 150, 80)
$Label = GUICtrlCreateLabel("",180,50, 100,"","",0x00000001)
GUISetState()
TCPStartup() ; TCP wird Initialisiert
$socketalt = TCPListen(@IPAddress1,$port) ; socket
While 1
$socket = TCPAccept($socketalt) ; verbindung mit client wird hergestellt
Switch GUIGetMsg() ; GUI Actions
Case $StartButton
$socket1=TCPConnect($ipClient,$port)
$x=TCPSend($socket1,GUICtrlRead($InputLabel))
Case $GUI_EVENT_CLOSE
TCPCloseSocket($socket1)
TCPShutdown()
ExitLoop
EndSwitch
_getMsg()
WEnd
Func _getMsg()
If $socket <> -1 Then ; Wenn Socket ungleich -1 ist, ...
$receivedData = TCPRecv($socket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$receivedData&@CRLF)
TCPCloseSocket($socket)
EndIf
EndFunc
Func _stopp()
TCPShutdown()
Exit
EndFunc
Client
Code:
;Client
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $ip, $port
$ipServer="XXXXXXXXX"
$port=""
HotKeySet("{ESC}","_stopp")
GUICreate("Client",300,200)
$StartButton = GUICtrlCreateButton("Start",10,10)
$InputLabel = GUICtrlCreateInput("",10,50,150,80)
$Label = GUICtrlCreateLabel("",180,50,100,"","",0x00000001)
GUISetState()
TCPStartup() ; TCP wird initialisiert
$altSocket=TCPListen(@IPAddress1,$port)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
TCPCloseSocket($socket)
TCPShutdown()
ExitLoop
Case $StartButton
_SendMsg()
EndSwitch
_GetMsg()
WEnd
Func _SendMsg()
$socket = TCPConnect($ipServer,$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
$msg = GUICtrlRead($InputLabel)
if $msg == 0 or $msg == "" Then
MsgBox(1,"Error","Error Fehler bei der Eingabe")
else
$sendedBytes = TCPSend($socket, $msg) ; Sendet den Text an unseren verbundenen Socket
EndIf
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
EndFunc
Func _GetMsg()
$newSocket=TCPAccept($altSocket)
$TCPRch=TCPRecv($newsocket,1024)
if $TCPRch <> "" Then
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$TCPRch&@CRLF)
EndIf
EndFunc
Func _stopp()
TCPShutdown()
Exit
EndFunc
EDIT _______________________ Die Scripte so dass sie laufen _____________________________
Ein kleiner Chat (klappt über eine Lan bzw. W-Lan Verbindung problemlos, online wurde er noch nicht getestet)
Server:
Code:
;Server
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <editConstants.au3>
#include <StaticConstants.au3>
#include <GuiEdit.au3>
Global $iPort,$iSocket1, $iSocket
$iPort= "XXXX"
$iSocket1 = -1
$iSocket = -1
HotKeySet("{ESC}","_stopp")
; GUI SETTINGS
GUICreate("Server",300,200)
$StartButton = GUICtrlCreateButton("Senden",220,155)
$InputLabel = GUICtrlCreateInput("",10,160, 200, 20)
$Label = GUICtrlCreateEdit("", 10, 10, 250, 140, $ES_AUTOHSCROLL + $ES_READONLY)
GUICtrlSetStyle($Label, $WS_VSCROLL)
GUISetState()
_GUICtrlEdit_SetReadOnly ( $Label, True)
TCPStartup() ; TCP wird Initialisiert
$iSocketalt = TCPListen(@IPAddress1,$iPort) ; socket wird erstellt
While 1
$iSocket = TCPAccept($iSocketalt) ; verbindung mit client wird hergestellt
_getMsg()
if $iSocket <> -1 then
ConsoleWrite("verbunden")
$iSocket1= $iSocket
EndIf
Switch GUIGetMsg() ; GUI Actions
Case $StartButton
if TCPSend($iSocket1,"x"&StringReplace(GUICtrlRead($InputLabel),Chr(1),"")&Chr(1)) == 0 Then
MsgBox(1,"Error","Es wurde nichts gesendet")
EndIf
Case $GUI_EVENT_CLOSE
_stopp()
EndSwitch
WEnd
Func _getMsg()
If TCPRecv($iSocket1,1)<> "" Then
$sBuffer = ""
ConsoleWrite("vor der do")
Do
$sBuffer = $sBuffer & TCPRecv($iSocket1, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($Socket)
Until StringTrimLeft($sBuffer, StringLen($sBuffer) - 1) = Chr(1) ; Chr(0) klappt nicht.
ConsoleWrite("nach der do")
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
EndIf
EndFunc
Func _stopp()
If $iSocket <> -1 Then
TCPCloseSocket($iSocket)
ElseIf $iSocket1 <> -1 Then
TCPCloseSocket($iSocket1)
EndIf
TCPShutdown()
Exit
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), "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
Client
Code:
;Client
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <editConstants.au3>
#include <StaticConstants.au3>
#include <GuiEdit.au3>
Global $i_Ip, $iPort, $iSocket
$i_IpServer="XXX.XXX.XXX.XX"
$iPort="XXXXX"
HotKeySet("{ESC}","_stopp")
GUICreate("Client",300,200)
$StartButton = GUICtrlCreateButton("Senden",220,155)
$InputLabel = GUICtrlCreateInput("",10,160,200,20)
$Label = GUICtrlCreateEdit("",10,10,250,140,$ES_AUTOHSCROLL + $ES_READONLY)
GUICtrlSetStyle($Label, $WS_VSCROLL)
GUISetState()
_GUICtrlEdit_SetReadOnly($Label,True)
TCPStartup() ; TCP wird initialisiert
$iSocket = TCPConnect($i_IpServer,$iPort) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$iSocket" ab
If $iSocket = -1 Then ; Wenn $iSocket = -1 ist, Fehlermeldung ausgeben
MsgBox(16, "Error", "Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
Exit
EndIf
;GUI Actions
While 1
_GetMsg()
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_stopp
Case $StartButton
_SendMsg()
EndSwitch
WEnd
Func _SendMsg()
$msg = GUICtrlRead($InputLabel)
$msg1 = "x"&StringReplace($msg,Chr(1), "")&Chr(1)
if $msg == 0 or $msg1 == "" Then
MsgBox(1,"Error","Error Fehler bei der Eingabe")
ElseIf TCPSend($iSocket, $msg1)== 0 Then ; Sendet den Text an unseren verbundenen Socket
MsgBox(16, "Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
EndIf
EndFunc
Func _GetMsg()
if TCPRecv($iSocket,1) <> "" then
$sBuffer = ""
Do
$sBuffer = $sBuffer & TCPRecv($iSocket,1024)
Until StringTrimLeft($sBuffer,stringLen($sBuffer)-1) = Chr(1)
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
EndIf
EndFunc
Func _stopp()
TCPCloseSocket($iSocket)
TCPShutdown()
Exit
EndFunc
|
|
|
06/01/2014, 18:47
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Ich hab mich mit deiner Problematik nicht ganz befasst, allerdings kannst du bei der _getMsg Funktion etwas korrigeren.
Sende deine Nachrichten am Ende immer mit einem Zeichen das einzigartig ist, damit du solange in den Buffer receiven kannst bis dieses Zeichen angekommen ist.
So vermeidest du Datenverlust.
Des Weiteren solltest du alle Handles von TCP-Verbindungen schließen wenn du das Programm beendest.
Außerdem speicherst du Werte ein die du nur tatsächlich einmal benötigst, unnötige Variablen zu erstellen zieht an der Performance.
Ein Beispiel ist der Teil beim Clienten mit $sendedBytes = ...
und If $sendedBytes...
Warum machst du daraus nicht direkt
Code:
If Not TCPSend($socket, $msg) Then MsgBox ;...
|
|
|
06/02/2014, 10:55
|
#3
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
Vielen Dank, mit den Variablen ist logisch habe ich einfach unnötig Code.
Hast du bei dem _getMsg Funktion ein Link für mich der das genauer erklärt?
Ich dachte bei TCP ist das mit dem Datenverlust nicht so relevant wie bei UDP.
Verbindungen schließen ist auch logisch.
|
|
|
06/02/2014, 11:46
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Generell würde ich dir erstmal raten die ungarische Notation dir anzugewöhnen, klar bei typenunspezifischen Sprachen wie AutoIt braucht man das nicht direkt aber es hilft trotzdem.
So könnte aus $ipClient $sIpClient werden (s = String) und aus $StartButton $hStart oder $btnStart.
Der Präfix hilft dir bei größeren Projekten dabei was in der Variable enthalten ist.
Das mit dem Zeichen am Ende ist ganz einfach.
Client sendet als Beispiel:
Code:
StringReplace("Hallo, das ist ein Text!", Chr(0), "") & Chr(0)
Dabei ist Chr(0) das Zeichen was eine Nachricht erfolgreich abschließt.
In der Nachricht selbst werden alle Chr(0) zur Sicherheit entfernt.
Der Server hat dann das hier als Schleife
Code:
$sBuffer = "" ;Buffer vor jedem receiven clearen.
Do
$sBuffer &= TCPRecv($hSocket, 2048)
Until StringTrimLeft($sBuffer, StringLen($sBuffer) - 1) = Chr(0)
Der Grund warum man ein speziellen Char am Ende haben sollte ist z.B. bei HTTP-Packets.
Dort werden viele kB gesendet und mit einem receiven kommt man da nicht weit, d.h. lieber solange dort receiven bis man ein </html> z.B. hat.
|
|
|
06/02/2014, 12:41
|
#5
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
Ist es eigentlich nötig die IP des Clienten zu kennen um eine Nachricht vom Server an den Clienten zu schicken oder kann man die aus der Verbindung Server -> Client herleiten? In meinem Fall muss ich diese ja Manuell eintragen.
Also ich habe mir überlegt es nach diesem Modell umzuschreiben:
Client "Hallo Server hier bin ich das ist meine IP"
Server"Hallo Client ich kann jetzt mit dir Kommunizieren"
Muss ich das so machen oder kann ich aus dem Socket die IP des Clienten auslesen? Oder nur die des Servers?
Ist der Buffer in diesem Fall nicht eine "Unnötige Variable" ? Würde das nicht
Code:
Do
TCTRecv($hSocket, 2048) ; Warum eigentlich 2048 Zeichen?
Until StringTrimLeft (TCPRecv ($hSocket, 2048), StringLen(TCPRecv ($hSocket, 2048) -1 ) = Chr(0)
den gleichen Effekt haben? Also was bringt mir der Buffer?
Ich bin auch für jeden Link mit Erklärungen zu den Verfahren bzw. Funktionen dankbar.
Die Autoit Hilfe bietet da leider nur eine sehr oberflächliche Erklärung.
|
|
|
06/02/2014, 13:05
|
#6
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
In der Hilfe gibt es zu TCPRecv glaube ich eine Funktion namens SocketToIp die den Socket von TCPAccept zu einer IP umwandelt.
Da muss der Client keine IP mitschicken, wäre ja Schwachsinn.
Falsch, es hätte nicht den selben Effekt.
Wenn du die erste Hälfte z.B. abrufst wird sie aus dem Buffer gelöscht, deshalb das $sBuffer &= TCPRecv($hSocket, 2048)
2048 Zeichen sind nur random gewählt, kannst auch jede andere Zahl nehmen.
|
|
|
06/02/2014, 14:01
|
#7
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
Das heißt ich könnte hier bei case $StartButton ff. auch einfach statt TCPConnect usw. die $socket Variable benutzen die ich die ganze Zeit sowieso schon nutze, also die die ich von TCPAccept zurück bekomme? Wenn der Client dann aber nicht in dem Moment sendet ist die Variable doch leer? wie könnte ich das lösen?
Code:
While 1
$socket = TCPAccept($socketalt) ; verbindung mit client wird hergestellt
Switch GUIGetMsg() ; GUI Actions
Case $StartButton
$socket1=TCPConnect($ipClient,$port)
$x=TCPSend($socket1,GUICtrlRead($InputLabel))
Case $GUI_EVENT_CLOSE
TCPCloseSocket($socket1)
TCPShutdown()
ExitLoop
EndSwitch
_getMsg()
WEnd
Edit ____
Hab das ganze mal versucht umzusetzen. Die Funktion SocketToip habe ich aus der Hilfe übernommen liefert aber immer den wert 0 zurück..
Hier müsste irgendwo der Denkfehler liegen. Vom Client kann ich Daten Empfangen der "$iSocket" ist auch nicht leer aber die Funktion liefert 0, was mach ich falsch?
Code:
$iSocket = TCPAccept($iSocketalt) ; verbindung mit client wird hergestellt
if $iSocket <> -1 then
ConsoleWrite("iSocket = "&$iSocket &@CRLF)
$ipClient= _SocketToIP($iSocket) ; aus bestehender Verbindung mit Client die Ip des Clienten erfassen
ConsoleWrite("Clientip = "&$ipClient&@CRLF)
EndIf
Quellcode Server
Code:
;Server
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $iPort, $iSocket1, $iSocket
$iPort= "37561"
$iSocket1 = -1
$iSocket = -1
HotKeySet("{ESC}","_stopp")
; GUI SETTINGS
GUICreate("Server",300,200)
$StartButton = GUICtrlCreateButton("Start",10,10)
$InputLabel = GUICtrlCreateInput("",10,50, 150, 80)
$Label = GUICtrlCreateLabel("",180,50, 100,"","",0x00000001)
GUISetState()
TCPStartup() ; TCP wird Initialisiert
$iSocketalt = TCPListen(@IPAddress1,$iPort) ; socket wird erstellt
While 1
$iSocket = TCPAccept($iSocketalt) ; verbindung mit client wird hergestellt
if $iSocket <> -1 then
ConsoleWrite("iSocket = "&$iSocket &@CRLF)
$ipClient= _SocketToIP($iSocket) ; aus bestehender Verbindung mit Client die Ip des Clienten erfassen
ConsoleWrite("Clientip = "&$ipClient&@CRLF)
EndIf
Switch GUIGetMsg() ; GUI Actions
Case $StartButton
$iSocket1= TCPConnect($ipClient,$iPort)
if TCPSend($iSocket1,GUICtrlRead($InputLabel)) == 0 Then
MsgBox(1,"Error","Es wurde nichts gesendet")
EndIf
TCPCloseSocket($iSocket1)
Case $GUI_EVENT_CLOSE
_stopp()
EndSwitch
_getMsg()
WEnd
Func _getMsg()
If $iSocket <> -1 Then ; Wenn Socket ungleich -1 ist, ...
$sBuffer = ""
Do
$sBuffer = $sBuffer & TCPRecv($iSocket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
Until StringTrimLeft($sBuffer, StringLen($sBuffer) - 1) = Chr(1) ; Chr(0) klappt nicht.
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
TCPCloseSocket($iSocket)
EndIf
EndFunc
Func _stopp()
If $iSocket <> -1 Then
TCPCloseSocket($iSocket)
ElseIf $iSocket1 <> -1 Then
TCPCloseSocket($iSocket1)
EndIf
TCPShutdown()
Exit
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), "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
|
|
|
06/02/2014, 17:59
|
#8
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Ich denke du hast einen kleinen Denkfehler drinne, was du versuchst ist glaube ich eine Message vom Clienten zu receiven und dann zu ihm zu connecten um ihm was zu senden.
Das kannst du aber über den selben Socket machen, wenn du als Server von einem Clienten über den Socket $hConnectedSocket z.B. was receivest kannst du auch TCPSend($hConnectedSocket, $sMsg) machen.
|
|
|
06/02/2014, 18:10
|
#9
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
Code:
;Server
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $iPort, $iSocket1, $iSocket
$iPort= "37561"
$iSocket1 = -1
$iSocket = -1
HotKeySet("{ESC}","_stopp")
; GUI SETTINGS
GUICreate("Server",300,200)
$StartButton = GUICtrlCreateButton("Start",10,10)
$InputLabel = GUICtrlCreateInput("",10,50, 150, 80)
$Label = GUICtrlCreateLabel("",180,50, 100,"","",0x00000001)
GUISetState()
TCPStartup() ; TCP wird Initialisiert
$iSocketalt = TCPListen(@IPAddress1,$iPort) ; socket wird erstellt
While 1
$iSocket = TCPAccept($iSocketalt) ; verbindung mit client wird hergestellt
if $iSocket <> -1 then
ConsoleWrite("iSocket = "&$iSocket &@CRLF)
$iSocket1= $iSocket
ConsoleWrite("isocket1 = "&$iSocket1&@CRLF)
EndIf
Switch GUIGetMsg() ; GUI Actions
Case $StartButton
if TCPSend($iSocket1,GUICtrlRead($InputLabel)) == 0 Then
MsgBox(1,"Error","Es wurde nichts gesendet")
EndIf
TCPCloseSocket($iSocket1)
Case $GUI_EVENT_CLOSE
_stopp()
EndSwitch
_getMsg()
WEnd
Func _getMsg()
If $iSocket <> -1 Then ; Wenn Socket ungleich -1 ist, ...
$sBuffer = ""
Do
$sBuffer = $sBuffer & TCPRecv($iSocket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
Until StringTrimLeft($sBuffer, StringLen($sBuffer) - 1) = Chr(1) ; Chr(0) klappt nicht.
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
TCPCloseSocket($iSocket)
EndIf
EndFunc
Func _stopp()
If $iSocket <> -1 Then
TCPCloseSocket($iSocket)
ElseIf $iSocket1 <> -1 Then
TCPCloseSocket($iSocket1)
EndIf
TCPShutdown()
Exit
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), "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
dann müsste es aber doch so funktionieren und das tut es nicht.
Ich glaube weil ich bei _getMsg den Socket schon schließe wenn ich ihn da offen lasse geht es aber auch nicht.
|
|
|
06/02/2014, 18:43
|
#10
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Den Socket von einem Clienten nicht schließen wenn er weitere Nachrichten senden möchte, lass den offen und prüfe ob neue Daten reinkommen.
|
|
|
06/02/2014, 20:23
|
#11
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
So läuft alles
Ein kleiner Chat (klappt über eine Lan bzw. W-Lan Verbindung problemlos, online wurde er noch nicht getestet)
Server:
Code:
;Server
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <editConstants.au3>
#include <StaticConstants.au3>
#include <GuiEdit.au3>
Global $iPort,$iSocket1, $iSocket
$iPort= "XXXX"
$iSocket1 = -1
$iSocket = -1
HotKeySet("{ESC}","_stopp")
; GUI SETTINGS
GUICreate("Server",300,200)
$StartButton = GUICtrlCreateButton("Senden",220,155)
$InputLabel = GUICtrlCreateInput("",10,160, 200, 20)
$Label = GUICtrlCreateEdit("", 10, 10, 250, 140, $ES_AUTOHSCROLL + $ES_READONLY)
GUICtrlSetStyle($Label, $WS_VSCROLL)
GUISetState()
_GUICtrlEdit_SetReadOnly ( $Label, True)
TCPStartup() ; TCP wird Initialisiert
$iSocketalt = TCPListen(@IPAddress1,$iPort) ; socket wird erstellt
While 1
$iSocket = TCPAccept($iSocketalt) ; verbindung mit client wird hergestellt
_getMsg()
if $iSocket <> -1 then
ConsoleWrite("verbunden")
$iSocket1= $iSocket
EndIf
Switch GUIGetMsg() ; GUI Actions
Case $StartButton
if TCPSend($iSocket1,"x"&StringReplace(GUICtrlRead($InputLabel),Chr(1),"")&Chr(1)) == 0 Then
MsgBox(1,"Error","Es wurde nichts gesendet")
EndIf
Case $GUI_EVENT_CLOSE
_stopp()
EndSwitch
WEnd
Func _getMsg()
If TCPRecv($iSocket1,1)<> "" Then
$sBuffer = ""
ConsoleWrite("vor der do")
Do
$sBuffer = $sBuffer & TCPRecv($iSocket1, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($Socket)
Until StringTrimLeft($sBuffer, StringLen($sBuffer) - 1) = Chr(1) ; Chr(0) klappt nicht.
ConsoleWrite("nach der do")
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
EndIf
EndFunc
Func _stopp()
If $iSocket <> -1 Then
TCPCloseSocket($iSocket)
ElseIf $iSocket1 <> -1 Then
TCPCloseSocket($iSocket1)
EndIf
TCPShutdown()
Exit
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), "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
Client
Code:
;Client
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <editConstants.au3>
#include <StaticConstants.au3>
#include <GuiEdit.au3>
Global $i_Ip, $iPort, $iSocket
$i_IpServer="XXX.XXX.XXX.XX"
$iPort="XXXXX"
HotKeySet("{ESC}","_stopp")
GUICreate("Client",300,200)
$StartButton = GUICtrlCreateButton("Senden",220,155)
$InputLabel = GUICtrlCreateInput("",10,160,200,20)
$Label = GUICtrlCreateEdit("",10,10,250,140,$ES_AUTOHSCROLL + $ES_READONLY)
GUICtrlSetStyle($Label, $WS_VSCROLL)
GUISetState()
_GUICtrlEdit_SetReadOnly($Label,True)
TCPStartup() ; TCP wird initialisiert
$iSocket = TCPConnect($i_IpServer,$iPort) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$iSocket" ab
If $iSocket = -1 Then ; Wenn $iSocket = -1 ist, Fehlermeldung ausgeben
MsgBox(16, "Error", "Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
Exit
EndIf
;GUI Actions
While 1
_GetMsg()
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_stopp
Case $StartButton
_SendMsg()
EndSwitch
WEnd
Func _SendMsg()
$msg = GUICtrlRead($InputLabel)
$msg1 = "x"&StringReplace($msg,Chr(1), "")&Chr(1)
if $msg == 0 or $msg1 == "" Then
MsgBox(1,"Error","Error Fehler bei der Eingabe")
ElseIf TCPSend($iSocket, $msg1)== 0 Then ; Sendet den Text an unseren verbundenen Socket
MsgBox(16, "Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
EndIf
EndFunc
Func _GetMsg()
if TCPRecv($iSocket,1) <> "" then
$sBuffer = ""
Do
$sBuffer = $sBuffer & TCPRecv($iSocket,1024)
Until StringTrimLeft($sBuffer,stringLen($sBuffer)-1) = Chr(1)
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
EndIf
EndFunc
Func _stopp()
TCPCloseSocket($iSocket)
TCPShutdown()
Exit
EndFunc
|
|
|
06/02/2014, 21:21
|
#12
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
So, jetzt erstmal optimieren.
|
|
|
06/03/2014, 12:19
|
#13
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
Vorschläge?
|
|
|
06/03/2014, 12:32
|
#14
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Ja.
Code:
Global $iPort,$iSocket1, $iSocket
$iPort= "XXXX"
$iSocket1 = -1
$iSocket = -1
Code:
_GUICtrlEdit_SetReadOnly ( $Label, True)
Code:
$iSocketalt = TCPListen(@IPAddress1,$iPort) ; socket wird erstellt
Code:
$iSocket = TCPAccept($iSocketalt)
Code:
if TCPSend($iSocket1,"x"&StringReplace(GUICtrlRead($InputLabel),Chr(1),"")&Chr(1)) == 0
Code:
$sBuffer = $sBuffer & TCPRecv($iSocket1, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($Socket)
Code:
$text = GUICtrlRead($Label)
GUICtrlSetData($Label,$text&@MDAY&"."&@MON&" "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$sBuffer&@CRLF)
Code:
Func _stopp()
If $iSocket <> -1 Then
TCPCloseSocket($iSocket)
ElseIf $iSocket1 <> -1 Then
TCPCloseSocket($iSocket1)
EndIf
TCPShutdown()
Exit
EndFunc
und das war gerade mal nur der Server...
Da kann man noch viel mehr optimieren.
|
|
|
06/03/2014, 12:41
|
#15
|
elite*gold: 0
Join Date: Aug 2009
Posts: 13
Received Thanks: 0
|
Optimieren im welchen Sinne? Also erweitern ausbauen oder mögliche Buggs beheben oder was meinst du?
|
|
|
Similar Threads
|
[S]Hilfe in Schule und Tipps | [B]26eg für Tipps
09/15/2012 - elite*gold Trading - 11 Replies
Hallo, gehe auf eine Gemeinschaftsschule, und wurde von dem Realschul-Niveau aufs Hauptschul-Niveau runtergesetzt, weil ich mich nicht angestrengt habe, und abgesackt bin.
Muss nun aber in den nächstne 2 halb Jahren wieder hochkommen, sonst kann ich auf der Schule nicht mein Realschulabchluss machen.
BItte schreibt unten tipps rein, die hilfreich sind.
Wenn sie hilfreich sind gibt es 26e*Gold.
|
All times are GMT +2. The time now is 16:25.
|
|