Hallo
Ich habe gerade ein Chatprogramm geschrieben.
Spoiler anzeigen
#NoTrayIcon
#include <GUIConstants.au3>
Dim $Mode = 0, $LocalMode = 1, $myIPADDRESS = @IPAddress1, $nPORT = 80, $ConnectedSocket = -1, $szIPADDRESS = "000.000.000.000", $TimeOut = 60
$Form1 = GUICreate("", 514, 367, 298, 212)
$Read = GUICtrlCreateEdit("", 8, 8, 497, 321, BitOR($ES_AUTOVSCROLL,$WS_VSCROLL))
$Write = GUICtrlCreateInput("", 8, 336, 417, 21)
$Send = GUICtrlCreateButton("Senden", 432, 336, 75, 21, $BS_DEFPUSHBUTTON)
$Form2 = GUICreate("Client/Server", 161, 235, 304, 220)
$GroupMode = GUICtrlCreateGroup("Client/Server", 8, 8, 145, 49)
$Radio1Mode = GUICtrlCreateRadio("Client", 16, 32, 65, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio2Mode = GUICtrlCreateRadio("Server", 80, 32, 57, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$GroupOptions = GUICtrlCreateGroup("Client", 8, 64, 145, 161)
$Label1Opt = GUICtrlCreateLabel("Geben Sie Portnummer ein:", 16, 80, 133, 17)
$Input1Opt = GUICtrlCreateInput($nPort, 56, 104, 49, 21, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
$Label2Opt = GUICtrlCreateLabel("Geben Sie Server-IP ein:", 16, 136, 129, 17, $SS_CENTER)
$Input2Opt = GUICtrlCreateInput($szIPADDRESS, 24, 160, 113, 21, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
$Button1Opt = GUICtrlCreateButton("Verbinden", 40, 192, 83, 25, $BS_DEFPUSHBUTTON )
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW, $Form2)
While 1
$nMsg = GUIGetMsg()
If $ConnectedSocket <> -1 Then $recv = TCPRecv( $ConnectedSocket, 2048 )
If @error Then Exit
If $Mode = 0 Then
Switch $nMsg
Case $Button1Opt
GUICtrlSetState($Input1Opt, $GUI_DISABLE)
GUICtrlSetState($Input2Opt, $GUI_DISABLE)
$nPORT = GUICtrlRead( $Input1Opt )
If $LocalMode = 1 Then
GUICtrlSetState($Button1Opt, $GUI_DISABLE)
$szIPADDRESS = GUICtrlRead( $Input2Opt )
TCPStartUp()
$ConnectedSocket = TCPConnect($szIPADDRESS,$nPORT)
If @error Then
MsgBox(4112,"Error","Connect failed with WSA error: " & @error)
GUICtrlSetState($Input1Opt, $GUI_ENABLE)
GUICtrlSetState($Input2Opt, $GUI_ENABLE)
GUICtrlSetState($Button1Opt, $GUI_ENABLE)
TCPShutdown()
Else
$Mode = 1
$szIPADRESS = SocketToIP($ConnectedSocket)
GUISetState(@SW_HIDE, $Form2)
GUISetState(@SW_SHOW, $Form1)
EndIf
ElseIf $LocalMode = 2 Then
GUICtrlSetData($Button1Opt, "Abbrechen")
$TimeOut = GUICtrlRead($Input2Opt)
TCPStartup()
$MainSocket = TCPListen($myIPADDRESS, $nPORT)
$sec=@SEC
Do
Sleep(10)
$nMsg = GUIGetMsg()
$ConnectedSocket = TCPAccept($MainSocket)
If $sec<>@SEC Then
$sec=@SEC
GUICtrlSetData($Input2Opt,GUICtrlRead($Input2Opt)-1)
If GUICtrlRead($Input2Opt) = 0 Then $ConnectedSocket = -2
EndIf
If $nMsg = $GUI_EVENT_CLOSE Then
TCPCloseSocket($MainSocket)
TCPShutdown()
Exit
ElseIf $nMsg = $Button1Opt Then
$ConnectedSocket = -2
EndIf
Until $ConnectedSocket <> -1
If $ConnectedSocket <> -2 Then
$szIPADRESS = SocketToIP($ConnectedSocket)
$Mode = 1
GUISetState(@SW_HIDE, $Form2)
GUISetState(@SW_SHOW, $Form1)
Else
TCPCloseSocket($MainSocket)
TCPShutdown()
GUICtrlSetState($Input1Opt, $GUI_ENABLE)
GUICtrlSetState($Input2Opt, $GUI_ENABLE)
GUICtrlSetData($Input2Opt, $TimeOut)
GUICtrlSetData($Button1Opt, "Start")
$ConnectedSocket = -1
EndIf
EndIf
Case $Radio1Mode
If $LocalMode <> 1 Then
$LocalMode = 1
GUICtrlSetData($Label2Opt, "Geben Sie Server-IP ein:")
GUICtrlSetData($Input2Opt, $szIPADDRESS)
GUICtrlSetData($Button1Opt, "Verbinden")
EndIf
Case $Radio2Mode
If $LocalMode <> 2 Then
$LocalMode = 2
GUICtrlSetData($Label2Opt, "Auf Verbindung warten")
GUICtrlSetData($Input2Opt, $TimeOut)
GUICtrlSetData($Button1Opt, "Starten")
EndIf
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
ElseIf $Mode = 1 Then
Switch $nMsg
Case $GUI_EVENT_CLOSE
TCPCloseSocket($ConnectedSocket)
TCPShutdown()
Exit
Case $Send
$szData = GUICtrlRead($Write)
If $szData <> '' Then
TCPSend($ConnectedSocket,$szData)
If @error Then Exit
GUICtrlSetData($Read,'127.0.0.1>' & $szData & @CRLF & GUICtrlRead($Read))
GUICtrlSetData($Write,'')
EndIf
EndSwitch
If $recv <> "" Then GUICtrlSetData($Read,$szIPADRESS & '>' & $recv & @CRLF & GUICtrlRead($Read))
EndIf
WEnd
Func SocketToIP($SHOCKET)
Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")
Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
"ptr",DLLStructGetPtr($sockaddr),"int_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
Kann ich an dem Code noch etwas verbessern?
(Ist noch Alphaversion, am Ende will ich ein Programm haben, das Daten verschlüsselt, Dateiübertragung und Remotesteuerung ermöglicht, und schöneren GUI hat.)