netzwerk problem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

sowas

Code: Alles auswählen

client = GetClientIP(Client)
ist ungünstig. benutze, verschiedene variablen für verschiedene dinge, sonst ist vielleicht nie richtig sicher, ob in client nun die ID oder die IP steckt :wink:
außerdem, sind Client und client die selbe variable (PB ist nicht case-sensitive). ich hoffe das weißt du bereits, ist aber übersichtlicher es im code auch gleich zu schreiben.
der paramterer 'Verbindung' (wird in der hilfe auch einfach 'Client' gennant) ist bei SendNetworkData() genauso wie bei ReceiveNetworkData().
bei ReceiveN...() hast du die ClientID ja durch EventClient() erhalten, nach dem du ein #PB_NetworkEvent_Data bemerkt hast.
wenn du jetzt einem Client etwas schicken willst, mußt du dessen ID raussuchen, die du dir gespeichert hattest (nach einem #PB_NetworkEvent_Connect und EventClient() )

Code: Alles auswählen

for i=0 to max
  if user(i)\name="the one that you what schicken willst"
    check=sendnetworkdata( user(i)\clientID, ... , ... )
    break
  endif
next

wobei es in deiner structure z.b. ein clientID.l gibt (unabhängig von einem clientIP.l oder dergleichen)


*..später*
>>welches davon ist jetzt richtig?
keines. für keine der fälle sind floats/double erforderlich oder sinnvoll.
du brauchst long, sonst nichts.
my pb stuff..
Bild..jedenfalls war das mal so.
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

lol das funzt alles nicht :cry: *verzweifelt biz* also der server hat ERFOLGREICH die message vom client erhalten. das habe ich so gemacht:

Code: Alles auswählen

  ReceiveNetworkData(client, *Buffer, 300)    
  Text$ = PeekS(*Buffer,300)
das klappt jetzt muss doch auch dieses klappen oder?

Code: Alles auswählen

  ReceiveNetworkData(client, *Buffer, 300)    
  Text$ = PeekS(*Buffer,300)
  SendNetworkData(client, *Buffer, 300)
allerdings funktioniert das nicht also der erhält den text richtig aber der verschickt nix ich habe bedesmal (hintereinander) die gleiche variable benutzt also habe ich sie in der kurzen zeit nicht verändert. der buffer muss auch noch voll sein also muss es doch gehen oder?
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

einen moment vll liegt das problem nicht am server sondern am client...

um zu gucken ob eine datei oder roh-daten übermittelt wurden muss man als client doch den befehl NetworkClientEvent(Verbindung) oder?
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag von mknjc »

Ohne es zu Testen:
Vieleicht geht es einfach nicht da du erst wieder eine Eventabfrage machen musst.

Also erst in der Hauptschleife gucken ob daten da sind
Wenn ja eine Variable setzen.
Und beim nächsten schleifendurchlauf gucken ob die Variable gesetzt ist und dann den String senden.

Mfg mknjc
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

@mknjc

meinst du beim client oder beil server? also ich kann euch den client kurz reinschreiben:

Code: Alles auswählen

 Ergebnis = NetworkServerEvent() 
    
    If ergebnis = 1
      Debug("dateien wurden empfangen")
      ReceiveNetworkData(Verbindung, *buffer,300)
      Text$ = PeekS(*Buffer)
      Debug (text$)
    EndIf
ich bin mir nicht sicher, ob ich NetworkServerEvent() oder NetworkClientEvent nutzen soll aber beides geht im moment nicht :(
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

im serverprogramm erhälts du die netzwerk-events für den erstellten server mit NetworkServerEvent(). und auf client-seite erhältst du die events mit NetworkClientEvent(verbindung), wobei du verbindung durch
Verbindung=OpenNetworkConnection(ServerName$, Port [, Modus])
erhalten hast, als du deinen client mit dem server verbunden hast.
(die hilfe redet hier seltsamerweise wieder von 'Client-Port '. das ist nicht richtig. gemeint ist ist die verbindungs-ID.
in 3.94 hieß das 'ConnectionID'. auf jeden fall ist das auf client-seite der rückgabewert von OpenNetworkConnection(..) [...'verbindung' entspricht auf serverseite der clientID.]
my pb stuff..
Bild..jedenfalls war das mal so.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag von mknjc »

So hab ma eben was Programmiert:

(Man brauch doch nich die Events abarbeiten)

Der Client:

Code: Alles auswählen

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

Port = 6832

Buffer = AllocateMemory(1000)

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
    MessageRequester("PureBasic - Client", "Client connected to server...", 0)
    
    SendNetworkString(ConnectionID, "Connect?")
    
    Repeat
        
        CEvent = NetworkClientEvent(ConnectionID)
        
        If CEvent = 2
            ReceiveNetworkData(ConnectionID, Buffer, 1000)
            If PeekS(Buffer) = "Connect!"
                MessageRequester("Client", "OK", 0)
                Quit = 1
            EndIf
            
        EndIf
        Delay(1)
        
    Until Quit = 1 
    
    
    CloseNetworkConnection(ConnectionID)
Else
    MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
  
End  
Der Server

Code: Alles auswählen

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
                    ReceiveNetworkData(ClientID, Buffer, 1000)
                    Debug PeekS(Buffer)
                    If PeekS(Buffer) = "Connect?"
                        MessageRequester("Client: "+Str(ClientID), "Connect?", 0)
                        SendNetworkString(ClientID, "Connect!")
                    EndIf
                Case 4
                    MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
                    Quit = 1
                    
            EndSelect
        EndIf
        Delay(1)
    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  
Mfg mknjc
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Kommt da rauf an wie fit du schon in pb bist.

http://www.purebasic.fr/german/viewtopi ... highlight=
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten