Probleme mit Netzwerk-Repeater

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Probleme mit Netzwerk-Repeater

Beitrag von Kukulkan »

Hallo,

ich will ein Tool machen, welches zwei Server-Ports öffnet. Da will ich jetzt einfach alles was bei einem reinkommt, zum anderen raussenden (und umgekehrt).

Server <-> Mediator <-> Client

Hier mein bisheriger Code:

Code: Alles auswählen

; VNC Mediator

#NetworkBufferSize = 256

InitNetwork()

*NetworkBufferServer.l = AllocateMemory(#NetworkBufferSize)
*NetworkBufferViewer.l = AllocateMemory(#NetworkBufferSize)
BytesCountServer.l = 0
BytesCountViewer.l = 0


ListenerServer.l = CreateNetworkServer(#PB_Any, 5500)
If ListenerServer.l = 0
  MessageRequester("VNC Mediator", "Can not open Port 5500 (server)!")
  End
EndIf

ListenerViewer.l = CreateNetworkServer(#PB_Any, 5900)
If ListenerViewer.l = 0
  MessageRequester("VNC Mediator", "Can not open Port 5900 (viewer)!")
  End
EndIf

Debug "Server gestartet!"

Repeat
  
  SEvent.l = NetworkServerEvent()
  
  If SEvent.l
  
    ClientID.l = EventClient()
    ServerID.l = EventServer()

    Select SEvent.l
    
      Case #PB_NetworkEvent_Connect
        ; -------------------------------------------------------------------------------------------------
        If ServerID.l = ListenerServer.l
          ConnectedServer.l = ClientID.l
          Debug "connected server"
          If BytesCountViewer.l > 0
            ; schon Daten im Viewer-Puffer. Sende gleich zurück...
            Debug "Sende Daten an server: " + Str(BytesCountViewer.l) + " bytes"
            SendNetworkData(ConnectedServer.l, *NetworkBufferViewer, BytesCountViewer.l)
            BytesCountViewer.l = 0
          EndIf
        EndIf
        If ServerID.l = ListenerViewer.l
          ConnectedViewer.l = ClientID.l
          Debug "connected viewer"
          If BytesCountServer.l > 0
            ; schon Daten im Server-Puffer. Sende gleich zurück...
            Debug "Sende Daten an viewer: " + Str(BytesCountServer.l) + " bytes"
            SendNetworkData(ConnectedViewer.l, *NetworkBufferServer, BytesCountServer.l)
            BytesCountServer.l = 0
          EndIf
        EndIf

      Case #PB_NetworkEvent_Data
        ; -------------------------------------------------------------------------------------------------
        If ServerID.l = ListenerServer.l
          ; Daten vom Server
          Repeat
            BytesCountServer.l = ReceiveNetworkData(ClientID.l, *NetworkBufferServer, #NetworkBufferSize)
            Debug "Empfange Daten von server: " + Str(BytesCountServer.l) + " bytes"
            If BytesCountServer.l > 0
              Content.s = PeekS(*NetworkBufferServer, BytesCountServer.l)
              Debug Content.s
              If BytesCountServer.l > 0 And ConnectedViewer.l <> 0
                Debug "Sofort sende Daten an viewer: " + Str(BytesCountServer.l) + " bytes"
                SentBytes.l = SendNetworkData(ConnectedViewer.l, *NetworkBufferServer, BytesCountServer.l)
                If SentBytes.l < BytesCountServer.l
                  ; re-send the rest after 20 milliseconds
                  Debug "Re-Send 1..."
                  Delay(10)
                  SentBytes.l = SendNetworkData(ConnectedViewer.l, *NetworkBufferServer + SentBytes.l, BytesCountServer.l - SentBytes.l)
                EndIf
              EndIf
              If BytesCountServer.l = -1
                Debug "-- socket error on server"
                BytesCountServer.l = 0
              EndIf
            EndIf
          Until BytesCountServer.l < #NetworkBufferSize
        EndIf
        
        If ServerID.l = ListenerViewer.l
          ; Daten vom Viewer
          Repeat
            BytesCountViewer.l = ReceiveNetworkData(ClientID.l, *NetworkBufferViewer, #NetworkBufferSize)
            Debug "Empfange Daten von viewer: " + Str(BytesCountViewer.l) + " bytes"
            If BytesCountViewer.l > 0
              Content.s = PeekS(*NetworkBufferViewer, BytesCountViewer.l)
              Debug Content.s
              If BytesCountViewer.l > 0 And ConnectedServer.l <> 0
                Debug "Sofort sende Daten an server: " + Str(BytesCountViewer.l) + " bytes"
                SentBytes.l = SendNetworkData(ConnectedServer.l, *NetworkBufferViewer, BytesCountViewer.l)
                If SentBytes.l < BytesCountViewer.l
                  ; re-send the rest after 20 milliseconds
                  Debug "Re-Send 2..."
                  Delay(10)
                  SentBytes.l = SendNetworkData(ConnectedViewer.l, *NetworkBufferViewer + SentBytes.l, BytesCountViewer.l - SentBytes.l)
                EndIf
              EndIf
              If BytesCountViewer.l = -1
                Debug "-- socket error on viewer"
                BytesCountViewer.l = 0
              EndIf
            EndIf
          Until BytesCountViewer.l < #NetworkBufferSize
        EndIf

      Case #PB_NetworkEvent_Disconnect
        ; -------------------------------------------------------------------------------------------------
        If ServerID.l = ListenerServer.l
          ConnectedServer.l = 0
          Debug "disconnected server"
        EndIf
        If ServerID.l = ListenerViewer.l
          ConnectedViewer.l = 0
          Debug "disconnected viewer"
        EndIf
  
    EndSelect
  EndIf
  Delay(1)
Until Quit.l = 1 

CloseNetworkServer(ListenerViewer.l)
CloseNetworkServer(ListenerServer.l)

End
Wie man sehen kann, möchte ich VNC Sessions da durchleiten. Wenn ich im Debug-Mode mit kleinem Puffer (zB #NetworkBufferSize = 200) öffne und auch das Debug-Fenster aufmache, dann klappt es. Ich sehe auf der Viewer-Seite den Server (wenn auch etwas langsam). Wenn ich das aber ohne Debug starte, dann schmiert mir der VNC-Viewer immer mit WriteExact: Socket error while writing ab. Also geht was schief, was mit der Verzögerung beim Debug zusammenhängt.

Hat jemand eine Ahnung woran das liegt?

[UPDATE] Sourcecode durch Refactoring besser lesbar gemacht.[/UPDATE]

Kukulkan
Zuletzt geändert von Kukulkan am 23.05.2011 15:00, insgesamt 1-mal geändert.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Probleme mit Netzwerk-Repeater

Beitrag von Kukulkan »

Hallo,

kann mir niemand helfen? Ich denke, das Problem hat mit dem Streaming von TCP/IP Daten zu tun. Meine Version (Source aus erstem Post) scheint mit Streaming nicht zurechtzukommen. Ich vermute mal, dass ich beim abarbeiten ein paar Regeln einhalten muss, die ich heute nicht beachte. Hat jemand einen Tipp für mich?

Oder muss ich zwei Threads/Programme machen, die jeweils eine Richtung unabhängig vom anderen bearbeiten? Würde das helfen?

Grüße,

Kukulkan
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Probleme mit Netzwerk-Repeater

Beitrag von Kukulkan »

Hm. Nichtmal eine Idee? Was kann da schief gehen?

Kukulkan
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Probleme mit Netzwerk-Repeater

Beitrag von cxAlex »

Naja, irgendwie gefällt mir der ganze Aufbau nicht. Da fehlen eine ganze Menge Fehlerüberprüfungen (Ob eventuell noch mehr Daten am Server zum Nachladen anstehen (#NetworkBufferSize = ByteCountViewer), ob das Senden fehlgeschlagen ist (SendNetworkData = -1 oder SendNetworkData <> BytesCountViewer), ... . Wobei mir die ganze Struktur nicht wirklich gefällt....

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Probleme mit Netzwerk-Repeater

Beitrag von Kukulkan »

Hallo Alex,

naja, dass die der Aufbau nicht gefällt hilft mir jetzt aber nicht Grad weiter...
Ob eventuell noch mehr Daten am Server zum Nachladen anstehen

Code: Alles auswählen

          Repeat
            BytesCountServer.l = ReceiveNetworkData(ClientID.l, *NetworkBufferServer, #NetworkBufferSize)
            (...)
          Until BytesCountServer.l < #NetworkBufferSize
Warum, ist das falsch??? Ich denke dass ich das prüfe...
ob das Senden fehlgeschlagen ist
Was soll ich denn dann tun? Im Moment macht er halt nix. Soll man es dann nochmal probieren oder was?

Kannst Du mir einen Tipp geben, wie man das besser aufbaut? Evtl. wenigstens die Grundstruktur? Ich wollte mal schnell einfach alles beidseitig durchleiten. Ist wohl etwas kritischer...

Grüße,

Kukulkan
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Probleme mit Netzwerk-Repeater

Beitrag von cxAlex »

Zumindest das sticht mir mal auf die Schnelle ins Auge:

Code: Alles auswählen

BytesCountViewer.l = ReceiveNetworkData(ClientID.l, *NetworkBufferViewer, #NetworkBufferSize)
Wenn BytesCountViewer = #NetworkBufferSize sind noch mehr Daten zum Nachladen da => du müsstest *NetworkBufferViewer resizen und an die entsprechende Stelle im Speicher das Fehlende nachladen. Die PB-Network-Events sind da etwas tückisch, wenn du etwas im Buffer vergisst kommt nicht! immer ein weiteres #PB_NetworkEvent_Data. Dann müsstest du aber auch die Größe der Buffer variabel machen und nicht statisch wie bisher. Auch müsstest du Das Ergebnis von SendNetworkData überprüfen und wenn nicht alles gesendet werden konnte ein paar ms warten und das Fehlende nachsenden.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Probleme mit Netzwerk-Repeater

Beitrag von Kukulkan »

Hi Alex,
Zumindest das sticht mir mal auf die Schnelle ins Auge:
Aber das was Du sagst mache ich doch schon von Anfang an. Im selben Event arbeite ich alles ab, bis BytesCountViewer.l < #NetworkBufferSize. Ist doch genau so realisiert. Oder sitz ich auf meinen Augen? Ich find deinen angesprochenen Punkt einfach nicht. Ich bin der Meinung, dass ich das bereits mache.

Das mit dem neu senden bei Sende-Problem kann ich mal versuchen. Wie lange sollte man das versuchen? Es bremst aber auf jeden Fall das gesamte Verhalten, denn alles muss auf den neuen Versuch warten...

Kukulkan
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Probleme mit Netzwerk-Repeater

Beitrag von cxAlex »

Ok jetzt sehe ich's auch, das ganze ist sehr unübersichtlich für mich :oops: . Du sendest das ganze immer sofort weiter. Ich würde das ganze erst immer in einen großen Block laden und dann weitersenden, aber sollte so auch klappen ...

Sonst sehe ich keine gravierenden Fehler, sorry.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Probleme mit Netzwerk-Repeater

Beitrag von Kukulkan »

Hallo,

ich habe jetzt noch die Prüfung auf den Sendepuffer eingebaut (Code im ersten Post wird gleich noch aktualisiert). Es hat aber nichts am Verhalten geändert. Ich dachte ich habe eine schnellere Reaktionszeit, wenn ich gleich alles wegsende. Ich werd wohl mal einen Test mit großem Puffer machen. Nur, wie groß sollte der sein? Mal vorneweg 65 KB?

Kukulkan
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Probleme mit Netzwerk-Repeater

Beitrag von cxAlex »

16k-32k sind die häufigsten Packetgrößen, zumindest waren Sie das bei meinen Proxy-Projekt.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten