Send Network Data DSCP Tag QoS

Für allgemeine Fragen zur Programmierung mit PureBasic.
wissenshunger
Beiträge: 6
Registriert: 07.07.2024 02:02

Send Network Data DSCP Tag QoS

Beitrag von wissenshunger »

Hallo zusammen,

ist es möglich mit Purebasic Netwerkdaten per IPv4 mit DSCP Tag zu senden um QoS zu verwenden?

Wenn es keine native Unterstützung gibt, vielleicht über eine Lib? Wichtig ist mir, dass die Funktion mit allen Compiler für alle OS geht.

Vielen Dank.
wissenshunger
Beiträge: 6
Registriert: 07.07.2024 02:02

Re: Send Network Data DSCP Tag QoS

Beitrag von wissenshunger »

Nachtrag: Vielleicht gibt es eine Möglichkeit das IPv4 Paket auch indirekt zu bearbeiten?
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Send Network Data DSCP Tag QoS

Beitrag von mk-soft »

Es sind IPv4 Header Daten und keine Nutzdaten die du Sendest.

Google
Wählen Sie „Lokale Computerrichtlinie“ > „Computerkonfiguration“ > „Windows-Einstellungen“. Klicken Sie mit der rechten Maustaste auf „Richtlinienbasiertes QoS“ und wählen Sie „Neue Richtlinie erstellen“. Schritt 2 – Benennen Sie die Richtlinie. Im folgenden Beispiel haben wir sie „Quicklink Studio“ genannt. Sie müssen dann einen DSCP-Dezimalwert festlegen. Für dieses Beispiel haben wir 46 verwendet.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
wissenshunger
Beiträge: 6
Registriert: 07.07.2024 02:02

Re: Send Network Data DSCP Tag QoS

Beitrag von wissenshunger »

mk-soft hat geschrieben: 08.02.2025 13:25 Es sind IPv4 Header Daten und keine Nutzdaten die du Sendest.
Das ist korrekt. Der DSCP Tag liegt direkt am Anfang von Layer 3 und somit im IPv4 Header. Klar lässt sich eine Richtlinie in Windows erstellen. Ich möchte aber, dass es die Anwendung direkt macht. Der Vorteil wäre die Portierbarkeit. Somit wäre der Tag auch bei Linux & macOS gesetzt. Also falls möglich. Die Anwendung "Zoom" macht dies schließlich auch.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Send Network Data DSCP Tag QoS

Beitrag von mk-soft »

Ich weiss nicht ob das so richtig ist.
Auf meiner VM Window 10 geht es nicht nach WireShark Diagnose ...


Update

Code: Alles auswählen

;-TOP

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  CompilerIf #PB_Compiler_Backend <> #PB_Backend_C
    CompilerError "Linux only with C-Backend!"
  CompilerEndIf
CompilerEndIf

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Macro GetLastError()
    GetLastError_()
  EndMacro
CompilerElse
  CompilerIf #PB_Compiler_Backend = #PB_Backend_C
    Procedure GetLastError()
      !#include "errno.h"
      !extern int errno;
      Protected r1
      !v_r1=errno;
      ProcedureReturn r1
    EndProcedure
  CompilerElse
    ImportC ""
      errno
    EndImport
    ;!extrn errno;
    Procedure GetLastError()
      Protected r1
      r1 = errno
      ProcedureReturn r1
    EndProcedure
  CompilerEndIf
CompilerEndIf

Procedure.s GetErrorString(ErrorCode)
  Protected r1.s, *buffer, len
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM|#FORMAT_MESSAGE_IGNORE_INSERTS, 0, ErrorCode, 0, @*buffer,0,0) 
      If len 
        r1 = PeekS(*buffer)
        LocalFree_(*buffer)
      EndIf
    CompilerDefault
      *buffer = strerror_(ErrorCode)
      r1 = PeekS(*buffer, -1, #PB_UTF8)
  CompilerEndSelect
  ProcedureReturn r1
EndProcedure
;


CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_MacOS
    
    #IPPROTO_IP   = 0
    #IP_TOS       = 3
    #IPPROTO_IPV6 = 41
    #IPV6_TCLASS  = 36
    
    Macro sock_errno()
      GetLastError()
    EndMacro
    
  CompilerCase #PB_OS_Linux
    
    #IPPROTO_IP   = 0
    #IP_TOS       = 1
    #IPPROTO_IPV6 = 41
    #IPV6_TCLASS  = 67
    
    Macro sock_errno()
      GetLastError()
    EndMacro
  CompilerCase #PB_OS_Windows
    
    #IPPROTO_IP   = 0
    #IP_TOS       = 3
    #IPPROTO_IPV6 = 41
    #IPV6_TCLASS  = 39
    
    ImportC ""
      Macro sock_errno()
        WSAGetLastError_()
      EndMacro
    EndImport
CompilerEndSelect

Procedure set_dscp(fd, dscp.a, flag = #PB_Network_IPv4)
  Protected r1
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
      Protected value.l
      Protected value6.l
    CompilerCase #PB_OS_Linux
      Protected value.l
      Protected value6.l
    CompilerCase #PB_OS_Windows
      Protected value.i
      Protected value6.i
  CompilerEndSelect
  
  If dscp > 63
    ProcedureReturn -1
  EndIf
  
  If flag = #PB_Network_IPv4
    value = dscp << 2
    If setsockopt_(fd, #IPPROTO_IP, #IP_TOS, @value, SizeOf(value))
      ProcedureReturn sock_errno()
    EndIf
  ElseIf flag = #PB_Network_IPv6  
    value6 = dscp << 2
    If setsockopt_(fd, #IPPROTO_IPV6, #IPV6_TCLASS, @value6, SizeOf(value6))
      ProcedureReturn sock_errno()
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  
  server = CreateNetworkServer(1, 9000, #PB_Network_IPv4)
  If server
    r1 = set_dscp(ServerID(1), 46, #PB_Network_IPv4)
    Debug GetErrorString(r1)
    CloseNetworkServer(1)
  EndIf
  
  Delay(500)
  server = CreateNetworkServer(1, 9000, #PB_Network_IPv6)
  If server
    r1 = set_dscp(ServerID(1), 46, #PB_Network_IPv6)
    Debug GetErrorString(r1)
    CloseNetworkServer(1)
  EndIf
  
CompilerEndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
wissenshunger
Beiträge: 6
Registriert: 07.07.2024 02:02

Re: Send Network Data DSCP Tag QoS

Beitrag von wissenshunger »

Ich habe den Code jetzt noch nicht getestet. Auf dem ersten Blick glaube ich, dass der Fehler im angegebenen IP Protokoll steckt. dieses muss 0x0800 für IPv4 sein. Ich werde das mal auf meiner Linux Maschine testen. Vielen Dank erst Mal für den Code.
wissenshunger
Beiträge: 6
Registriert: 07.07.2024 02:02

Re: Send Network Data DSCP Tag QoS

Beitrag von wissenshunger »

Also auf Linux funktioniert der Code einwandfrei. Allerdings habe ich Ihn auf die Clientseite umgestellt. Ohne Error Unterstützung läuft er auch ohne C_Backend:

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_MacOS
    #IPPROTO_IP   = 0
    #IP_TOS       = 3
    #IPPROTO_IPV6 = 41
    #IPV6_TCLASS  = 36
    
  CompilerCase #PB_OS_Linux
    #IPPROTO_IP   = 0
    #IP_TOS       = 1
    #IPPROTO_IPV6 = 41
    #IPV6_TCLASS  = 67
    
  CompilerCase #PB_OS_Windows
    #IPPROTO_IP   = 0
    #IP_TOS       = 3
    #IPPROTO_IPV6 = 41
    #IPV6_TCLASS  = 39
    
CompilerEndSelect


Procedure set_dscp(fd, dscp.a, flag = #PB_Network_IPv4)
  Protected r1
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
      Protected value.i
      Protected value6.i
    CompilerCase #PB_OS_Linux
      Protected value.i
      Protected value6.i
    CompilerCase #PB_OS_Windows
      Protected value.i
      Protected value6.i
  CompilerEndSelect
  
  If dscp > 63
    ProcedureReturn -1
  EndIf
  
  If flag = #PB_Network_IPv4
    value = dscp << 2
    ;int setsockopt( int s, int level, int optname, const void *optval, socklen_t optlen );
    If setsockopt_(fd, #IPPROTO_IP, #IP_TOS, @value, SizeOf(value))
      ;ProcedureReturn sock_errno()
    EndIf
  ElseIf flag = #PB_Network_IPv6  
    value6 = dscp << 2
    If setsockopt_(fd, #IPPROTO_IPV6, #IPV6_TCLASS, @value6, SizeOf(value6))
      ;ProcedureReturn sock_errno()
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  
  *NetworkBuf = AllocateMemory(181)
  PokeS(*NetworkBuf, "Here is a String in a DSCP Tag Paket!", -1, #PB_Ascii)
;  server = CreateNetworkServer(#PB_Any, 9000, #PB_Network_UDP | #PB_Network_IPv4)
  ConnID = OpenNetworkConnection("192.168.178.1", 9000, #PB_Network_UDP | #PB_Network_IPv4)
  If ConnID
   r1 = set_dscp(ConnectionID(ConnID), 56, #PB_Network_IPv4)
   ;Debug GetErrorString(r1)
   Delay(300)
    SendNetworkData(ConnID, *NetworkBuf, 180)
    
    
    CloseNetworkConnection(ConnID)
  EndIf
    
  
CompilerEndIf


Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Send Network Data DSCP Tag QoS

Beitrag von mk-soft »

Unter macOS und Linux funktioniert dieses auch bei mir.
Solltest aber ohne errno das r1 zurückgeben. Bei NULL Ok
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten