UDP Server empfängt nichts vom UDP Client
Verfasst: 12.12.2004 15:57
Hallo !
Ich hab leider Probleme mit dem Windows netzwerk und wollt mir ein Tool schreiben um Daten zwischen Laptop und PC austauschen zu können. Leider hab ich nun folgendes Problem: irgendwie, wenn [c]BuildClient()[/c] versucht was an den Server zu schicken passiert das senden zwar von der Rückgabe der Prozedur her erfolgreich aber beim Server kommt nicht wirklich was an
. Hier mal der komplette Code:
ich weiß, nicht grade das ordentlichste. Enstand an einem Samstag nachmittag. MVXA mein 2. Nick.
Ich hab leider Probleme mit dem Windows netzwerk und wollt mir ein Tool schreiben um Daten zwischen Laptop und PC austauschen zu können. Leider hab ich nun folgendes Problem: irgendwie, wenn [c]BuildClient()[/c] versucht was an den Server zu schicken passiert das senden zwar von der Rückgabe der Prozedur her erfolgreich aber beim Server kommt nicht wirklich was an
Code: Alles auswählen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; -= File Manager =- ;;
;; ;;
;; Protokoll: Siehe irgendwo auf dem ;;
;; Schreibtisch (gilt nur für den ;;
;; Programmierer) ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Structure sNetPacket
pakBefehl.l
pakLeange.l
pakClientID.s
pakGUID.s
pakData.s
EndStructure
Structure sClients
cltGUID.s
cltUDPID.UDPUserID
cltReceiveFileID.l
EndStructure
Declare cMain()
Declare CPrint(pText.s, Head.b)
Declare SplitNetPacket(ReceivedPacket.s)
Declare SendNetPacket(lngBefehl.l, strGUID.s, strData.s, IsClient.b, *UDPClientID.UDPUserID)
Declare.s Base64Encode(strText.s)
Declare.l HexToLong(strHex.s)
Declare.s Base64Decode(strText.s)
Declare Base64Decoder(b64in$, b64len.l ,*b64out, b64max.l)
Declare ParseNetPacket(*R_NetPacket.sNetPacket)
Declare.l CheckGUIDLogedIn(strGUID.s)
Declare BuildServer()
Declare BuildClient()
Declare ParseCommand()
Enumeration 1
#NETServer
#NETClient
EndEnumeration
#NewLine = Chr(2)
Global ServerPort.l
Global ServerHost.s
Global ServerPswd.s
Global ClientGUID.s
Global Mode.b
Global sckMain.UDPConnect
Global DummyNetPacket.sNetPacket
Global DummyUser.UDPUserID
NewList ClientPool.sClients()
cMain()
End
Procedure cMain()
DefType.l Selection
OpenConsole()
ConsoleTitle("NetFile")
UDPInitNetwork()
CPrint("NetFile - ein Programm von MVXA" + #NewLine, #False)
ParseCommand()
If Mode = 0
CPrint(" 1) Build ^CServer" + #NewLine, #False)
CPrint(" 2) Build ^CClient" + #NewLine, #False)
CPrint("", #True): Selection = Val(Input()): PrintN("")
Select Selection
Case 1
Mode = #NETServer
CPrint("Server Port ", #True)
ServerPort = Val(Input()): PrintN("")
CPrint("Server Passwort ", #True)
ServerPswd = Input(): PrintN("")
BuildServer()
Case 2
Mode = #NETClient
CPrint("Server Host ", #True)
ServerHost = Input(): PrintN("")
CPrint("Server Port ", #True)
ServerPort = Val(Input()): PrintN("")
CPrint("Server Passwort ", #True)
ServerPswd = Input(): PrintN("")
BuildClient()
EndSelect
Else
Select Mode
Case #NETServer: BuildServer()
Case #NETClient: BuildClient()
EndSelect
EndIf
EndProcedure
Procedure BuildServer()
ServerHost = IPString(UDPGetLocalIP())
Debug MD5Fingerprint(@ServerPswd, Len(ServerPswd))
CPrint("Build Server...", #True)
If UDPCreateServer(ServerPort, sckMain)
CPrint("^AOK" + #NewLine, #False)
UDPStartCaptureEvents(sckMain)
*ReceiveBuffer = AllocateMemory(1025)
Repeat
If UDPDataAvailable(sckMain) <> 0
UDPReceive(sckMain, *ReceiveBuffer, 1024)
CPrint(PeekS(*ReceiveBuffer, 1024), #True)
SplitNetPacket(PeekS(*ReceiveBuffer, 1024))
ParseNetPacket(DummyNetPacket)
RtlFillMemory_(*ReceiveBuffer, 1024, 0)
EndIf
Select Asc(Left(Inkey(), 1))
Case 27 ; Escape
Break
EndSelect
Delay(1)
ForEver ; Left(Inkey(), 1) = Chr(27)
Else
CPrint("^CERROR" + #NewLine, #False)
EndIf
EndProcedure
Procedure BuildClient()
DefType.s pstrMD5Password
pstrMD5Password = MD5Fingerprint(@ServerPswd, Len(ServerPswd))
CPrint("Baue Verbindung zum Server auf", #True)
If UDPConnectServer(ServerPort, ServerHost, sckMain)
UDPStartCaptureEvents(sckMain)
Repeat
SendNetPacket(0000, "", pstrMD5Password, #True, DummyUser)
CPrint(".", #False)
Delay(2500)
Until UDPDataAvailable(sckMain) <> 0
EndIf
EndProcedure
Procedure ParseNetPacket(*R_NetPacket.sNetPacket)
DefType.s MD5PWD, CurDate
Debug *R_NetPacket\pakBefehl
Select *R_NetPacket\pakBefehl
Case 0000 ; Connect
MD5PWD = MD5Fingerprint(@ServerPswd, Len(ServerPswd))
If *R_NetPacket\pakData = MD5PWD
AddElement(ClientPool())
UDPSaveUserID(ClientPool()\cltUDPID, sckMain)
CurDate = Str(Date())
ClientPool()\cltGUID = MD5Fingerprint(@CurDate, Len(CurDate))
SendNetPacket(0001, "SERVER_GUID", ClientPool()\cltGUID, #False, ClientPool()\cltUDPID)
CPrint("Neue verbindung durch Client aufgebaut !"+ #NewLine, #True)
EndIf
Case 0002 ; Nachricht
If CheckGUIDLogedIn(*R_NetPacket\pakGUID) <> 0
CPrint("Client " + Str(CheckGUIDLogedIn(*R_NetPacket\pakGUID)) + ": " + *R_NetPacket\pakData, #True)
EndIf
EndSelect
EndProcedure
Procedure ParseCommand()
DefType.s Befehl, Parameter
DefType.s Param
Repeat
Param = ProgramParameter()
Befehl = StringField(Param, 1, "=")
Parameter = StringField(Param, 2, "=")
Select LCase(Befehl)
Case "/build"
Select LCase(Trim(Parameter))
Case "server": Mode = #NETServer
Case "client": Mode = #NETClient
EndSelect
Case "/port" : ServerPort = Val(Trim(Parameter))
Case "/host" : ServerHost = Trim(Parameter)
Case "/password": ServerPswd = Trim(Parameter)
EndSelect
Until Param = ""
EndProcedure
Procedure.l CheckGUIDLogedIn(strGUID.s)
ForEach ClientPool()
If ClientPool()\cltGUID = strGUID: ProcedureReturn ListIndex(ClientPool()): EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure SplitNetPacket(ReceivedPacket.s)
DefType.s tmpPacket, tmpNetData, tmpGUID
DefType.l tmpPacketPtr, tmpLaenge, tmpBefehl
Repeat
tmpPacketPtr + 1
tmpPacket = StringField(ReceivedPacket, tmpPacketPtr, Chr(4))
If tmpPacket <> ""
Debug tmpPacket
tmpBefehl = HexToLong(StringField(StringField(tmpPacket, 1, Chr(1)), 1, Chr(2)))
tmpLaenge = HexToLong(StringField(StringField(tmpPacket, 1, Chr(1)), 2, Chr(2)))
tmpGUID = StringField(StringField(tmpPacket, 1, Chr(1)), 3, Chr(2))
tmpNetData = StringField(tmpPacket, 2, Chr(1))
If Len(tmpNetData) = tmpLaenge
Debug "/CMD: " + Str(tmpBefehl) + "/LEN: " + Str(tmpLaenge) + "/GID: " + tmpGUID + "/DAT: " + tmpNetData
DummyNetPacket\pakBefehl = tmpBefehl
DummyNetPacket\pakLeange = tmpLaenge
DummyNetPacket\pakClientID = tmpGUID
DummyNetPacket\pakData = Base64Decode(tmpNetData)
Debug Str(Len(DummyNetPacket\pakData)) + "=" + DummyNetPacket\pakData
Else
CPrint("^CFehlerhaftes Packet empfangen !", #True)
EndIf
EndIf
Until tmpPacket = ""
EndProcedure
Procedure.b SendNetPacket(lngBefehl.l, strGUID.s, strData.s, IsClient.b, *UDPClientID.UDPUserID)
DefType.l PaketLen, lngResult
DefType.s tmpPaket
strData = Base64Encode(strData)
PaketLen = Len(strData)+Len(strGUID)+32
*UDPSendBuffer = AllocateMemory(PaketLen)
tmpPaket = RSet(Hex(lngBefehl), 4, "0")
tmpPaket = tmpPaket + Chr(2)
tmpPaket = tmpPaket + RSet(Hex(Len(strData)), 4, "0")
tmpPaket = tmpPaket + Chr(2)
tmpPaket = tmpPaket + strGUID
tmpPaket = tmpPaket + Chr(1)
tmpPaket = tmpPaket + strData
tmpPaket = tmpPaket + Chr(4)
PokeS(*UDPSendBuffer, tmpPaket)
Debug "Sending Buffer: " + PeekS(*UDPSendBuffer)
Select Client
Case #True
lngResult = UDPSend(sckMain, *UDPSendBuffer, PaketLen)
Case #False
lngResult = UDPSendToUser(sckMain, *UDPClientID, *UDPSendBuffer, PaketLen)
Default
ProcedureReturn #False
EndSelect
Debug "Sending Buffer Result: " + Str(lngResult)
RtlFillMemory_(*UDPSendBuffer, PaketLen, 0)
FreeMemory(*UDPSendBuffer)
EndProcedure
Procedure.s Base64Encode(strText.s)
DefType.s Result
*B64EncodeBufferA = AllocateMemory(Len(strText)+1)
*B64EncodeBufferB = AllocateMemory((Len(strText)*3)+1)
PokeS(*B64EncodeBufferA, strText)
Base64Encoder(*B64EncodeBufferA, Len(strText), *B64EncodeBufferB, Len(strText)*3)
Result = PeekS(*B64EncodeBufferB)
FreeMemory(*B64EncodeBufferA)
FreeMemory(*B64EncodeBufferB)
ProcedureReturn Result
EndProcedure
Procedure.s Base64Decode(strText.s)
DefType.s Result
*B64DecodeBuffer = AllocateMemory(Len(strText)+1)
Base64Decoder(strText, Len(strText), *B64DecodeBuffer, Len(strText))
Result = PeekS(*B64DecodeBuffer)
FreeMemory(*B64DecodeBuffer)
ProcedureReturn Result
EndProcedure
Procedure.s GetPCName()
DefType.s Result
DefType.l Laenge
Laenge = 255
Result = Space(Laenge)
GetComputerName_(@Result, @Laenge)
ProcedureReturn Result
EndProcedure
Procedure Base64Decoder(b64in$, b64len.l ,*b64out, b64max.l)
*b64in.l = @b64in$ ; <- put this in to use a string as parameter
;convert tables
For b64x = 0 To 255
b64asc$ = b64asc$ + Right("0000000" + Bin(b64x),8) + "|" ;ASC Binary Code
Next b64x
b64tab$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;base64 Code
RtlFillMemory_(*b64out,b64max,0)
;decode
b64tln = b64len / 4
For b64xln.l = 0 To b64tln -1
b64bcd$ = PeekS(*b64in+b64xln*4,4)
b64bin$ = ""
b64pad = 0
For b64xb = 1 To 4
b64tcd$ = Mid(b64bcd$,b64xb,1)
b64num = FindString(b64tab$,b64tcd$,0) ;base64 to 6 Bit-Code
If b64num > 0
If b64num = 65
b64pad +1
EndIf
b64bin$ +Right("000000" + Bin(b64num-1),6) ;24 Bit code
Else
b64err = 1
b64xln = b64tln +1
EndIf
Next b64xb
For b64xu = 0 To 2-b64pad
b64bit$ = Mid(b64bin$,1+b64xu*8,8) + "|"
b64num = FindString(b64asc$,b64bit$,0) /9 ;ASC Code 8 Bit Binary
PokeS(*b64out+b64buf,Chr(b64num))
b64buf +1
If b64buf >b64max
b64err = 1
b64xln = b64tln +1
EndIf
Next b64xu
Next b64xln
If b64err = 1
RtlFillMemory_(*b64out,b64max,0)
b64buf = -1
EndIf
ProcedureReturn b64buf
EndProcedure
Procedure.l HexToLong(strHex.s)
DefType.l HexLen, ptrI, ZeichenASC, Dec
DefType.s Zeichen
strHex = UCase(strHex)
HexLen = Len(strHex)
For ptrI = 0 To HexLen - 1
Zeichen = Mid(strHex, HexLen - ptrI, 1)
If Asc(Zeichen) >= 65 And Asc(Zeichen) >= 55 + 16
ProcedureReturn 0
EndIf
If Asc(Zeichen) >= 65
ZeichenASC = 10 + Asc(Zeichen) - 65
Else
ZeichenASC = Val(Zeichen)
EndIf
Dec + ZeichenASC * Pow(16, ptrI)
Next
ProcedureReturn Dec
EndProcedure
Procedure CPrint(pText.s, Head.b)
DefType.l i
DefType.s Color, tmpStr
CharToOEM_(@pText, @pText)
If Head = #True
CPrint("^8> ", #False)
ConsoleColor(7, 0)
EndIf
For i = 1 To Len(pText)
If Mid(pText, i, 1) = "^"
Color = UCase(Mid(pText, i + 1, 1))
Select Color
Case "0": Color = "0" ; 0 Schwarz -_-
Case "1": Color = "1" ; 1 Blau
Case "2": Color = "2" ; 2 Grün
Case "3": Color = "3" ; 3 Türkis
Case "4": Color = "4" ; 4 Rot
Case "5": Color = "5" ; 5 Magenta
Case "6": Color = "6" ; 6 Braun
Case "7": Color = "7" ; 7 Hellgrau (Std.)
Case "8": Color = "8" ; 8 Dunkelgrau
Case "9": Color = "9" ; 9 Hellblau
Case "A": Color = "10" ; 10 Hellgrün
Case "B": Color = "11" ; 11 Cyan
Case "C": Color = "12" ; 12 Hellrot
Case "D": Color = "13" ; 13 Helles Magenta
Case "E": Color = "14" ; 14 Gelb
Case "F": Color = "15" ; 15 Weiß
Default:
Print(Mid(pText, i, 2))
EndSelect
ConsoleColor(Val(Color), 0)
i = i + 1
ElseIf Mid(pText, i, 1) = #NewLine
PrintN("")
Else
Print(Mid(pText, i, 1))
EndIf
Next
ConsoleColor(7, 0)
EndProcedure