Seite 1 von 1

Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 11:43
von gekkonier
Folgender Server und Client zeigen korrekt im Debugger das ü und das € Zeichen an, allerdings nur, wenn ich beide Executables OHNE Unicode Modus kompiliere.


Server:

Code: Alles auswählen

InitNetwork()

port = 1234
buffersize = 1000
*buffer = AllocateMemory(buffersize)

CreateNetworkServer(0, port)

Repeat
  sevent = NetworkServerEvent()
  
  If sevent
    clientid = EventClient()
    Select sevent
      Case #PB_NetworkEvent_Connect
        Debug "s: client connected"
      Case #PB_NetworkEvent_Data
        Debug "s: client has send!"
        ReceiveNetworkData(clientid, *buffer, buffersize)
        debugstring.s = ">" + PeekS(*buffer) + "<"
        Debug debugstring
      Case #PB_NetworkEvent_File
        Debug "s: ignore file"
      Case #PB_NetworkEvent_Disconnect
        Debug "s: client disconnected"
        quit = 1
    EndSelect

  EndIf

Until quit = 1
Debug "s: quit!"
Client:

Code: Alles auswählen

InitNetwork()
port = 1234
conid = OpenNetworkConnection("127.0.0.1", port)
SendNetworkString(conid, "ü€")
CloseNetworkConnection(conid)
Mir ist klar, dass der Code keine Fehlerüberprüfungen eingebaut hat - es geht echt nur um den Test hier - der Code wird in dieser Form in weiteren Programmen sicher nicht verwendet!

Wenn ich bei beiden Files Unicode in den Compiler Options aufdrehe, kommt Mist an, siehe angehängtes Bild:

Bild

Ich hab jetzt schon viele Threads gelesen, die dieses Thema behandeln, ich kriegs aber nicht gebacken im Unicode Modus einen vernünftigen String von A nach B zu schicken - desweiteren fehlt mir ein wenig das Verständnis zu den Peek und Poke Dingen, womit ich vielleicht was zusammenstricken könnte. Bitte verzeiht mir meine Unwissenheit.
Kann mir wer helfen und bitte mit einem minimalen funktionierendem Beispiel aushelfen?

Wichtig wäre, dass der Code in 4.31 unter Windows funktioniert - die 4.4 Betas will ich nicht verwenden, solange sogar die Installation der Entwicklungsumgebung den Antivirus herausfordert (nein, ich installiere keinen anderen Antivirus - ein Kunde würde das ja auch nicht tun...)

Vielen herzlichen Dank!

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 12:00
von helpy
Im UNICODE-Modus sendet der Befehl SendNetworkString den String im UTF-8 Format.

Deshalb funktioniert im Server PeekS(*buffer) nicht, da damit *buffer als UNICODE String gelesen wird.

Lösung: PeekS(*buffer, -1, #PB_UTF8)

ACHTUNG: SendNetworkString sendet den String OHNE dem NULL-Zeichen am Ende. Wenn also im Empfangspuffer nach dem String noch Zeichen (Restzeichen von letzter Übertragung) kommen dann liest PeekS(*buffer, -1, #PB_UTF8) diese ebenfalls mit!

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 12:07
von STARGÅTE
Du solltest nicht mit SendNetworkString arbeiten denn das sendet den String nicht im gewünschten Format.

Schreibe mit PokeS() den String in einen Buffer, und sende den Buffer normal mit SendNetworkData() ...


EDIT: Oder nutze den vorschlag von helpy und lese den String anders aus ...

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 12:58
von gekkonier
Vielen Dank für die Infos - ich würde gerne den Ansatz von STARGÅTE verwenden, um eben das Problem mit Zeichen im Buffer einer vorherigen Sendung zu vermeiden. Andererseits könnt ich ja den Buffer jedesmal freigeben und neu allozieren, oder?

Egal, jedenfalls raucht mein Kopf, ich verzweifle an PokeS, PeekS, Receive und Sendnetworkdata.

Jetzt schauts mal so aus:
Server:

Code: Alles auswählen

InitNetwork()

port = 1234
buffersize = 1000
*buffer = AllocateMemory(buffersize)

CreateNetworkServer(0, port)

Repeat
  sevent = NetworkServerEvent()
  
  If sevent
    clientid = EventClient()
    Select sevent
      Case #PB_NetworkEvent_Connect
        Debug "s: client connected"
      Case #PB_NetworkEvent_Data
        Debug "s: client has send!"
        ReceiveNetworkData(clientid, *buffer, buffersize)
        string.s = PeekS(*buffer, #PB_UTF8)
        debugstring.s = ">" + string + "<"
        Debug debugstring
      Case #PB_NetworkEvent_File
        Debug "s: ignore file"
      Case #PB_NetworkEvent_Disconnect
        Debug "s: client disconnected"
        quit = 1
    EndSelect

  EndIf

Until quit = 1
Debug "s: quit!"
Client:

Code: Alles auswählen

InitNetwork()

port = 1234
buffersize = 1000
*buffer = AllocateMemory(buffersize)

conid = OpenNetworkConnection("127.0.0.1", port)
PokeS(*buffer, "ü€", #PB_UTF8)
SendNetworkData(conid, *buffer, buffersize)
CloseNetworkConnection(conid)
Der Debugger zeigt mir bei der betreffenden Ausgabe allerdings >ü?< an.
Habe ich da einen grob fahrlässigen Fehler gemacht?

Falls ja, bitte versucht es für Dummys zu erklären, ich steig nicht mehr durch. :oops:
Vielen lieben Dank, Gregor

Edit: Natürlich verwenden, nicht vermeiden - sorry!

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 13:20
von STARGÅTE
ich habe mal n "dumme" Frage, aber wie machst du das € "EuroZeichen" ?

Wenn ich das nämlich über AltGr+E eingeben kommt zwar ein schwarzes Rechteck im Editor, aber der Debugger zeigt mit das € an ...

ich stelle hier also kein Fehler fest ...

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 13:41
von gekkonier
Anderen Font einstellen, einen mit Euro Symbol im Satz, bei mir Courier New.

Hier nochmal der komplette Quelltext, inklusive der Settings - ich finde keinen Fehler, Unicode ist bei beiden aufgedreht, aber der Debugger zeigt mir trotzdem das € als ? an - habe jetzt auch Sicherheitshalber die Courier New für den Debugger eingestellt - daran kanns also auch nicht liegen. Kann bitte noch wer mit 4.31 unter XP aufwärts probieren und berichten - wäre sehr nett.

Server:

Code: Alles auswählen

InitNetwork()

port = 1234
buffersize = 1000
*buffer = AllocateMemory(buffersize)

CreateNetworkServer(0, port)

Repeat
  sevent = NetworkServerEvent()
  
  If sevent
    clientid = EventClient()
    Select sevent
      Case #PB_NetworkEvent_Connect
        Debug "s: client connected"
      Case #PB_NetworkEvent_Data
        Debug "s: client has send!"
        ReceiveNetworkData(clientid, *buffer, buffersize)
        string.s = PeekS(*buffer, #PB_UTF8)
        debugstring.s = ">" + string + "<"
        Debug debugstring
      Case #PB_NetworkEvent_File
        Debug "s: ignore file"
      Case #PB_NetworkEvent_Disconnect
        Debug "s: client disconnected"
        quit = 1
    EndSelect

  EndIf

Until quit = 1
Debug "s: quit!"
; IDE Options = PureBasic 4.31 (Windows - x86)
; CursorPosition = 12
; EnableUnicode
; EnableThread
; EnableXP
; EnableOnError
; Executable = server.exe
; CompileSourceDirectory
Client:

Code: Alles auswählen

InitNetwork()

port = 1234
buffersize = 1000
*buffer = AllocateMemory(buffersize)

conid = OpenNetworkConnection("127.0.0.1", port)
PokeS(*buffer, "ü€", #PB_UTF8)
SendNetworkData(conid, *buffer, buffersize)
CloseNetworkConnection(conid)

; IDE Options = PureBasic 4.31 (Windows - x86)
; CursorPosition = 5
; EnableUnicode
; EnableThread
; EnableXP
; EnableOnError
; Executable = client.exe
; DisableDebugger
; CompileSourceDirectory

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 14:31
von gekkonier
Okay, folgendes:

Code: Alles auswählen

teststring.s = "ü€"
Debug "ü€"
Debug teststring
Im "normalem" Modus: Debugger zeigt richtig ü€ 2x an.
Im "Unicode" Modus: Debugger zeigt 2x ü? an.

Ich bin verwirrt....
Ist das ein Bug oder bin ich ein Trottel der das proggen in PB sein lassen sollte? :mrgreen:

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 15:04
von Rokur
Wenn du im Unicode-Modus kompilierst, dann solltest du den Quellcode als UTF-8 speichern, und das auch in den Compiler-Optionen unter "Text-Kodierung des Quellcodes" einstellen. Dann klappts auch mit deinem Beispiel. :wink:

Re: Network mit Unicode, Strings senden und empfangen

Verfasst: 13.11.2009 15:25
von gekkonier
Oh Mann! *stirnklatsch*
Danke!

Mein oben geposteter Netzwerkcode funktioniert mit dem Setting dann auch endlich wie er soll...