Seite 1 von 2

Frage zu SendNetworkString()

Verfasst: 26.02.2007 21:52
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.

Verfasst: 26.02.2007 22:01
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 

Verfasst: 26.02.2007 22:20
von knautschka
Ah, Danke! Auch wenn es mein Problem nicht vollständig löst. Aber das kann ich ja auch mit KeyboardReleased() machen, oder?

Verfasst: 26.02.2007 22:24
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

Verfasst: 26.02.2007 22:33
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...

Verfasst: 26.02.2007 22:45
von HeX0R
Du musst ConnectionID für SendNetworkString benutzen und nicht Port!

Verfasst: 26.02.2007 22:46
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:

Verfasst: 26.02.2007 22:49
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 ?

Verfasst: 26.02.2007 23:05
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...

Verfasst: 26.02.2007 23:38
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.