Ich habe 2 Programme (Chat). Das eine ist der Server und das andere der Client. Ds ganze geht über UDP. Es funktioniert auch ganz toll. Bis das Programm (Server/Client) ein UDPRecv($socket,50) macht. Danach ist in $socket die IP "0.0.0.0", sogar wenn ich $socket vorher als Constante mache! Es bringt auch nichts direkt nachdem UDPRecv() $socket[2] wieder auf die eigentliche IP zu setzen. Die eigentliche IP steht dann zwar wieder im Socket, aber mein UDPSend() (den ich danach ausführen will) geht nicht. Das allerkomischste daran ist. Das UDPRecv() keinen fehler zurückgibt (also UDPRecv() gibt kein FALSE zurück und setz auch nicht @error). Auch gibt UDPRecv nachher immer noch alles empfangen zurück, obwohl $socket nicht mehr stimmt!
Edit: ich tu dann doch ma die Sourcen posten
Edit2: Es kommt noch komischer...
... der hat im socket schon die ip auf 0.0.0.0 gesetzt doch dann beim
if ($data=="LOGIN") (beim server)
hab ich ma am ende der if ein
UDPSend("MSG_Willkommen")
hingesetzt. (also mit "MSG" fangen die Messages am) Und siehe da er sendet das
also das ist sehr komisch.
Server:
#NoTrayIcon
#include <GuiConstants.au3>
#include <Date.au3>
; vars
global $socket
global $input, $chatbox
global $logsh = FALSE
global $child
; func
func quit()
if (MsgBox(4+32,"Beenden","Wollen Sie OurChat wirklich beenden?")==6) then exit
endfunc
func command($command)
$command = StringSplit($command,"_")
return $command[1]
endfunc
func arg($command,$arg)
$arg = $arg+1
if ($arg<0 or $arg>UBound($arg)) then $arg = 2
$command = StringSplit($command,"_")
return $command[$arg]
endfunc
func sendmsg()
$message = GUICtrlRead($input)
if (StringLen($message)>1024) then $message = StringLeft($message,1024)
if ($message=="") then return
GUICtrlSetData($input,"")
GUICtrlSetData($chatbox,GUICtrlRead($chatbox)&"Eiermann ("&_NowTime(5)&") :"&@CRLF&$message&@CRLF&@CRLF)
UDPSend($socket,"MSG_"&$message)
GUICtrlSetState($input,$GUI_FOCUS)
endfunc
func logsh()
if ($logsh==TRUE) then
GUISetState(@SW_HIDE,$child)
$logsh = FALSE
else
GUISetState(@SW_SHOW,$child)
$logsh = TRUE
endif
endfunc
; gui
opt("GUIOnEventMode",1)
$parent = GuiCreate("OurChat - Eiermann", 600, 400,-1, -1 , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$online = GuiCtrlCreateEdit("Eiermann", 500, 50, 100, 310)
$chatbox = GuiCtrlCreateEdit("", 0, 0, 500, 380,$ES_READONLY)
$input = GuiCtrlCreateInput("", 0, 380, 500, 20)
$sendbutton = GuiCtrlCreateButton("Send", 500, 380, 100, 20)
$logbutton = GuiCtrlCreateButton("Log (s/h)", 500, 360, 100, 20)
$banner = GuiCtrlCreatePic("banner_eiermann.bmp", 500, 0, 100, 50)
; other
GUISetOnEvent($GUI_EVENT_CLOSE,"quit")
GUICtrlSetOnEvent($sendbutton,"sendmsg")
GUICtrlSetOnEvent($logbutton,"logsh")
GUICtrlSetState($sendbutton,$GUI_DEFBUTTON)
GUICtrlSetLimit($input,1024)
GUICtrlSetState($input,$GUI_FOCUS)
GUICtrlSetBkColor($chatbox,"0xffffff")
GuiSetState(@SW_SHOW,$parent)
; child gui
$child = GUICreate("Server",300,300,-1,-1,-1,$WS_EX_TOPMOST,$parent)
$box = GUICtrlCreateEdit("",10,10,280,280,$ES_READONLY)
GUICtrlSetBkColor($box,"0xffffff")
GUISetOnEvent($GUI_EVENT_CLOSE,"logsh")
GUISetState(@SW_HIDE,$child)
; program
$inip = InputBox("Eingehende IP","Bitte geben Sie die eingehende IP ein:","127.0.0.1")
if ($inip=="") then exit
UDPStartup()
$socket = UDPBind($inip, 65532)
If (@error<>0) Then Exit
While 1
$data = UDPRecv($socket, 50)
If ($data<>"") Then
GUICtrlSetData($box,$socket[2]&">"&$data&@CRLF&GUICtrlRead($box))
if ($data=="LOGIN") then ; confirm login
GuiCtrlSetData($online,"Eiermann"&@CRLF&"Schneemann")
UDPSend($socket,"OK")
endif
;MsgBox(0,"test",command($data))
if (command($data)=="MSG") then ; recieve message
GuiCtrlSetData($chatbox,GuiCtrlRead($chatbox)&"Schneemann ("&_NowTime(5)&") :"&@CRLF&arg($data,1)&@CRLF&@CRLF)
UDPSend($socket,"OK")
endif
if ($data=="END") then
UDPCloseSocket($socket)
UDPShutdown()
GUIDelete()
MsgBox(16,"Fehler","Der Client wurde beendet!")
exit
endif
EndIf
sleep(100)
WEnd
; exit-funtion
Func OnAutoItExit()
GUIDelete()
if ($socket<>-1) then
UDPSend($socket,"END")
UDPCloseSocket($socket)
UDPShutdown()
endif
endfunc
Alles anzeigen
Client:
#NoTrayIcon
#include <GuiConstants.au3>
#include <Date.au3>
; vars
global $socket = -1
global $input, $chatbox
; func
func quit()
if (MsgBox(4+32,"Beenden","Wollen Sie OurChat wirklich beenden?")==6) then exit
endfunc
func command($command)
$command = StringSplit($command,"_")
return $command[1]
endfunc
func arg($command,$arg)
$arg = $arg+1
if ($arg<0 or $arg>UBound($arg)) then $arg = 2
$command = StringSplit($command,"_")
return $command[$arg]
endfunc
func sendmsg()
$message = GUICtrlRead($input)
if (StringLen($message)>1024) then $message = StringLeft($message,1024)
if ($message=="") then return
UDPSend($socket,"MSG_"&$message)
GUICtrlSetData($input,"")
GUICtrlSetData($chatbox,GUICtrlRead($chatbox)&"Schneemann ("&_NowTime(5)&") :"&@CRLF&$message&@CRLF&@CRLF)
GUICtrlSetState($input,$GUI_FOCUS)
endfunc
; gui
opt("GUIOnEventMode",1)
GuiCreate("OurChat - Schneemann", 600, 400,-1, -1 , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$online = GuiCtrlCreateEdit("Eiermann"&@CRLF&"Schneemann", 500, 50, 100, 330)
$chatbox = GuiCtrlCreateEdit("", 0, 0, 500, 380,$ES_READONLY)
$input = GuiCtrlCreateInput("", 0, 380, 500, 20)
$sendbutton = GuiCtrlCreateButton("Send", 500, 380, 100, 20)
$banner = GuiCtrlCreatePic("banner_schneemann.bmp", 500, 0, 100, 50)
; events
GUISetOnEvent($GUI_EVENT_CLOSE,"quit")
GUICtrlSetOnEvent($sendbutton,"sendmsg")
GUICtrlSetState($sendbutton,$GUI_DEFBUTTON)
GUICtrlSetLimit($input,1024)
GUICtrlSetState($input,$GUI_FOCUS)
GUICtrlSetBkColor($chatbox,"0xffffff")
; program
$server = InputBox("Server-IP","Bitte geben Sie die Server-IP ein:","127.0.0.1")
if ($server=="") then exit
UDPStartup()
$socket = UDPOpen($server, 65532)
If ($socket==-1 or @error<>0) Then
MsgBox(16,"Fehler!","Kann nicht mit dem Server verbinden")
exit
endif
UDPSend($socket,1)
UDPSend($socket,"LOGIN") ; login
$timer = TimerInit()
Do
$answer = UDPRecv($socket,2)
if (TimerDiff($timer)>10000) then
MsgBox(16,"Fehler!","Server hat das Login nicht bestätigt")
exit
endif
Until ($answer=="OK")
GuiSetState(@SW_SHOW) ; gui an
While 1
$data = UDPRecv($socket, 50)
;MsgBox(0,"UDP-Socket",$socket[1]&@CRLF&$socket[2]&@CRLF&$socket[3])
If ($data<>"") Then
if (command($data)=="MSG") then ; recieve message
GuiCtrlSetData($chatbox,GuiCtrlRead($chatbox)&"Eiermann ("&_NowTime(5)&") :"&@CRLF&arg($data,1)&@CRLF&@CRLF)
UDPSend($socket,"OK")
endif
if ($data=="END") then
UDPCloseSocket($socket)
UDPShutdown()
GUIDelete()
MsgBox(16,"Fehler","Der Server wurde beendet!")
exit
endif
EndIf
sleep(100)
WEnd
; exit-funtion
Func OnAutoItExit()
GUIDelete()
if ($socket<>-1) then
UDPSend($socket,"END")
UDPCloseSocket($socket)
UDPShutdown()
endif
EndFunc
Alles anzeigen