Network mit Unicode, Strings senden und empfangen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Network mit Unicode, Strings senden und empfangen

Beitrag 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!
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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!
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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:
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Re: Network mit Unicode, Strings senden und empfangen

Beitrag 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:
WinXP 32 Bit, PureBasic 4.40 (x86)
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Re: Network mit Unicode, Strings senden und empfangen

Beitrag von gekkonier »

Oh Mann! *stirnklatsch*
Danke!

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