Frage zu SendNetworkString()

Anfängerfragen zum Programmieren mit PureBasic.
knautschka
Beiträge: 8
Registriert: 19.01.2007 21:49
Wohnort: Dortmund
Kontaktdaten:

Frage zu SendNetworkString()

Beitrag von knautschka »

Hi! Ich habe schon in der Hilfe geguckt, und auch in der Forensuche geguckt.

Also, ich habe folgendes Problem. Ich möchte einen String vom Client zum Server senden.

Die Codes:

Server:

Code: Alles auswählen

Client=3808920
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case 1
        
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
             
          

  
        Case 2
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(Buffer), 0)
  
        Case 3
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case 4
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
          Quit = 1
    
      EndSelect
    EndIf
   
   ; If NetworkClientEvent(Client) 
   ; ReceiveNetworkData(Client,1000,1000)
   ; EndIf
   

   
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf

  
End   
Client:

Code: Alles auswählen

InitSprite()
InitKeyboard()

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Buffer=AllocateMemory(200)

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)
  
 
  
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
If ConnectionID  
OpenScreen(1024,768,16,"client")   


hallo.s="Hallo!"

Repeat
ExamineKeyboard()
ClearScreen(RGB(0,0,255))

If KeyboardPushed(#PB_Key_Return)
SendNetworkString(Port,hallo.s)
EndIf 

;If NetworkServerEvent() = #PB_NetworkEvent_Data
;ReceiveNetworkData(Port, *Buffer, 200)
;StartDrawing(ScreenOutput())
;DrawText(0,0,"String wurde empfangen.")
;StopDrawing()
;EndIf 

If KeyboardPushed(1) And ConnectionID

  CloseNetworkConnection(ConnectionID)
EndIf 

FlipBuffers()
Until KeyboardPushed(1)
CloseScreen()
EndIf 
Wenn ich den Client starte, gibt er mir "Invalid Memory Acess" aus. Irgendwas soll nicht mit SendNetworkString(Port,hallo.s) stimmen. Nur was? Ich kann den Fehler einfach nicht finden. Bin noch ein Anfänger in Sachen Server & Client. Bitte helft mir.

Ich danke im Voraus.
Ich bin's... ;-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

von network hab ich keinen plan...

aber:
1.
deine buffer sind unterschiedlich groß
2.
wenn du auf tastendrücke innerhalb einer screen-schleife reagierst,
dann wird der entspechende code x-mal ausgeführt, nämlich so lange,
wie die taste gedrückt ist.
da musst du mit einem flag arbeiten, damit die aktion wirklich
nur einmal pro tastendruck ausgeführt wird:

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Return) 
  If RetPres = 0
    RetPres = 1
    ; hier die Aktion einfügen
  EndIf
Else
  RetPres = 0
EndIf 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
knautschka
Beiträge: 8
Registriert: 19.01.2007 21:49
Wohnort: Dortmund
Kontaktdaten:

Beitrag von knautschka »

Ah, Danke! Auch wenn es mein Problem nicht vollständig löst. Aber das kann ich ja auch mit KeyboardReleased() machen, oder?
Ich bin's... ;-)
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Da hast du recht.
Mir ist da noch was aufgefallen, leider kenne ich diese Tastaturbefehle noch nicht so und damit deren Funktionsweise.
Also du rufst sendnetworkstring auf und das in einer Schleife, es wird also evtl. mehrfach ausgeführt (nacheinander). aber schon nach dem ersten aufruf (K, sieh mal meine Schweibweise :-) wird die Verbindung gelöscht, damit auch der Speicherbereich. Nun versucht Sendnetworkstring wieder zu senden, über einen Speicherbereich (socket usw.) der gar nicht mehr existiert, da getrennt. ich denke daran liegt es.
ungetestet:

Code: Alles auswählen

If KeyboardPushed(1) And ConnectionID
            CloseNetworkConnection(ConnectionID)
ConnectionID=0
    EndIf

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Return) And ConnectionID
    SendNetworkString(Port,hallo.s)
EndIf
1. Win10
PB6.1
knautschka
Beiträge: 8
Registriert: 19.01.2007 21:49
Wohnort: Dortmund
Kontaktdaten:

Beitrag von knautschka »

Ich hab das mal so übernommen, Problem besteht aber immer noch... er zeigt immer noch denselben Fehler an. Und ich frag mich schon die ganze Zeit wieso, ich check nich, warum... wobei ich bis jetzt alles in den Griff in Sachen PureBasic bekommen hatte. Aber das bereitet mir Schwierigkeiten, da ich gar nicht weiß, wo der Fehler überhaupt herkommt...
Ich bin's... ;-)
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du musst ConnectionID für SendNetworkString benutzen und nicht Port!
knautschka
Beiträge: 8
Registriert: 19.01.2007 21:49
Wohnort: Dortmund
Kontaktdaten:

Beitrag von knautschka »

Also ConnectionID statt den Port? Die PureBasic Hilfe ist an der Stelle ziemlich ungenau... ih probiers mal.

Edit: Danke! Es klappt! Ihr habt mir sehr weitergeholfen. :allright:
Ich bin's... ;-)
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

PB Hilfe hat geschrieben: Sendet einen String zum angegebenen Client 'Verbindung'. Dieser Befehl kann von beiden, Client- und Server-Applikationen, genutzt werden.

Auf der Server-Seite ist 'Verbindung' der Client, welcher diese Daten empfangen soll.
Auf der Client-Seite wird 'Verbindung' von OpenNetworkConnection() zurückgegeben.
Ähm ... *hust*, was genau ist hier ungenau ?
knautschka
Beiträge: 8
Registriert: 19.01.2007 21:49
Wohnort: Dortmund
Kontaktdaten:

Beitrag von knautschka »

OpenNetworkConnection("127.0.0.1", Port)
Ja, da hat mich die OpenNetworkConnection in meinem Skript verwirrt, die das ja angeben soll. Also habe ich "Port" genommen...
Ich bin's... ;-)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Aber das kann ich ja auch mit KeyboardReleased() machen, oder?

kommt drauf an.
in diesem fall mag das in ordnung sein,
aber wenn es z.b. in einem spiel um einen sprung der spielfigur geht,
dann ist es extrem störend, wenn sie erst springt wenn man die taste losläßt.
es ist also sinnvoll, auch die arbeitsweise mit dem flag zu kennen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten