Network Server/Client

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Network Server/Client

Beitrag von Kumpu »

Hallo!
Ich versuche einen Server zu schreiben. Ok, das ist dank der Beispiele in der Hilfe nicht weiter schwer. Aber das Problem ist dass ich ja die IP meines Rechners wissen muss, um mich mit ihm zu verbinden!
Gibt ja ein paar Seiten die einem die IP verraten, da habe ich auch eine bekommen - konnte aber damit keine Verbindung zu mir ( :D ) herstellen. Wenn ich die IP aus dem Bsp nehme geht es natürlich, aber die ist ja lokal und so... Dann steht ja bei OpenNetworkConnection noch was von Servername... kP
Eigentlich ist die IP von diesen Websites doch nur die meines Routers, oder? D.h. Ich kann ja nicht mit meinem Router reden, ich muss doch den PC dahinter noch anwählen und so... Ich kenn mich damit echt nicht besonderst aus und hoffe ihr könnt mir helfen. Es gibt hier noch so einen thread (von wegen chatt und so) aber das bringt mich auch nicht weiter. Wie verbinde ich einen anderen pc mit meinem??
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Benutzeravatar
HeX0R
Beiträge: 3042
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:

Re: Network Server/Client

Beitrag von HeX0R »

Du musst den Port, den du benutzen willst, in deinem Router auf den entsprechenden Client (also dessen lokale IP) umleiten.
Meist in der Router-Config als Port-Forwarding bezeichnet.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Network Server/Client

Beitrag von Raphi »

Das anzeigen der IP kann je nach betreibsysthem anders sein.
Bei Vista ist einfach:
auf die Netzwerkverbindung gehen ZB. Drahtlose netzwerkverbindung

Dann öffnet sich Netzwerk und Freigabe Center.

Dort auf status anzeiten und dann auf Details.

Wenn du die IP ändern willst, kannst du auch auf Eigenschaften gehen - Internetprotokoll 4 - Eigenschaften - Folgende IP Adresse verwenden, und die gewünschte IP und Subnetzmaske eingeben.
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Network Server/Client

Beitrag von Raphi »

Wegen dem Server: Ein Computer ist der Server und der Andere der Client.

Du must also einen Server mittels

Code: Alles auswählen

CreateNetworkServer(Serverzahl, Port)
erstellen. :allright:
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Re: Network Server/Client

Beitrag von Kumpu »

Jo Raphi das mit CreateNetworkServer habe ich natürlich gemacht, so schlau war ich noch... Wie gesagt mit der lokalen IP kann ich mich ja verbinden. Ich werde dann den Tip von HeXOR mal ausprobieren, so ähnlich hatte ich mir das auch vorgestellt (nur das man das einstellen muss wusste ich nicht).
Also danke für die Hilfe, ich denke das haut hin :)
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Network Server/Client

Beitrag von gnasen »

Wenn es lokal klappt, wird es daran liegen. Hatte selbiges Problem auch einmal, am besten einfach in der Anleitung nachschlagen, wie man einzelne Ports freigeben kann (nicht alle freigeben!)
pb 4.51
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Network Server/Client

Beitrag von mk-soft »

Port nicht freigeben sondern im Router ein Portforwarding einrichten. Meisten unter der NAT Einstellung zu finden.
Dann brauch man noch die IP-Adresse die vom Provider vergeben wurde. Zum Testen einfach im Router nach schauen.
Wenn man aber immer denn eigenen Rechner verreichen möchte kann man sich bei http://www.dyndns.org einen Host einrichten.
Der Rounter muss dann auf kontinunierliche Verbindung gestellt werden dir Dyndns eingetragen werden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Re: Network Server/Client

Beitrag von Kumpu »

Ok, mit dem Portforwarding funzt es problemlos. Allerdings hab ich öfters mal eine neue IP, und das nervt mich ziemlich. Wie geht das mit http://dyndns.org ?? ich finde die Webseite verwirrend...
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Network Server/Client

Beitrag von Josh »

Kumpu hat geschrieben:Wie geht das mit http://dyndns.org ??
du meldest dich bei dyndns an und bekommst eine url (z.b. kumpu.dyndns.org) über die du dann immer erreichbar bist. dann musst du diese url noch in deinem router einstellen (sollte eigentlich bei allen halbwegs aktuellen routern gehen). wenn der router jetzt eine neue ip bekommt, meldet er diese sofort an dyndns und du bist sofort wieder über deine url erreichbar.

wenn es in deinem router geht, solltest du noch einstellen, dass er sich z.b. immer um 04:00 eine neue ip holt. dann hast du nicht während des tages deine providerseitige 24 stundenabmeldung. mit wechsel der ip nummer kracht sonst auch deine verbindung zusammen.

wenn du bei einem hoster eine eigene domain hast, dann kannst du dort vieleicht auch eine subdomain anlegen und diese zur weiterleitung an deinen router verwenden.
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Re: Network Server/Client

Beitrag von Kumpu »

OK, hab mich mal bei DynDNS angemeldet, kann meinen Server zwar noch nicht erreichen, aber das wird schon denk ich.
Ich hab mal ein erstes Online Spiel geschriebn, Pingpong für 2 Spieler Online - aber es funzt natürlich nicht. Ich hab so keine Ahnung was falsch ist :( Habe schon fast alles versucht, sogar mit nem einfachen Bot der mir Random was rüberschiebt (was funktioniert hat^^)
Hier mal der Code für den Host:

Code: Alles auswählen

Port = 6832
InitNetwork()
OpenWindow(0,100,100,500,500,"PP :D")
StickyWindow(0,1)
EditorGadget(0,1,1,498,470)
modus = MessageRequester("Modus wählen...","Möchten sie im Vollbildmodus spielen???",#PB_MessageRequester_YesNo)-5
speed=Val(InputRequester("Speed","Bitte Startwert für Speed eingeben.","4"))

Procedure.s username()
 s1$=GetHomeDirectory()
 i=Len(s1$)-1
 While Mid(s1$,i,1)<>"\"
  i=i-1
 Wend
 s1$=Mid(s1$,i+1,Len(s1$)-i-1)
 ProcedureReturn s1$
EndProcedure

Procedure AddL(Text$)
 AddGadgetItem(0,CountGadgetItems(0)+1,Text$)
EndProcedure

Procedure Sende(CID,Text$)
 Delay(20)
 SendNetworkString(CID,Text$)
EndProcedure

Procedure SendeInt(CID,Zahl)
 Delay(20)
 *Buffer=AllocateMemory(10)
 PokeI(*Buffer,Zahl)
 SendNetworkData(CID,*Buffer,10)
EndProcedure

addl("Erstelle Server...")

user$=username()

If CreateNetworkServer(0,port)
  addl("Server erstellt.")
  addl("Speed="+Str(speed))
  addl("Warte auf Mitspieler.")
  
  Repeat
    WindowEvent=WaitWindowEvent(10)
    If WindowEvent= #PB_Event_CloseWindow 
      End
    EndIf
    
    SEvent=NetworkServerEvent()
     If sevent
      CID = EventClient()
      Select SEvent
      
        Case 1
          Addl("Neuer Client verbunden: CID="+Str(CID)+", IP="+IPString(GetClientIP(CID)))
  
        Case 2
          *Buffer = AllocateMemory(1000)
          ReceiveNetworkData(CID, *Buffer, 1000)
          s1$=PeekS(*Buffer)
          addl("Nachricht: "+s1$)
          
          If s1$ = "Hier ist ein Pingpong-Client, let's play a game!"
           quit=1
           t1=ElapsedMilliseconds()
           addl("Pingpong-Client verbunden, starte in 5s!")
           Sende(CID,"User: "+user$)
           sende(CID,"Speed: "+Str(speed))
           Sende(CID,"OK, verstanden, aufi!")
           addl("Bestätigung gesendet.")
          EndIf
          
          If CountString(s1$,"User: ")
           user2$=RemoveString(s1$,"User: ")
           addl("Spieler2="+user2$)
          EndIf
 
        Case 4
          addl("Client "+Str(CID)+" hat die verbindung geschlossen.")
          quit=0
    
      EndSelect
     EndIf
     
    Until (quit=1 And ElapsedMilliseconds()-t1>5000)
  
EndIf  

  InitSprite()
  InitKeyboard()
  If modus=1
   OpenScreen(1024,768,32,"Online PingPong")
  Else
   OpenWindow(1,10,10,1024,768,"PingPong by David Fritsche :P",#PB_Window_ScreenCentered)
   OpenWindowedScreen(WindowID(1),0,0,1024,768,0,0,0)
  EndIf

  UsePNGImageDecoder()  
  CatchSprite(0,?Back)
  CatchSprite(1,?Paddle)
  CatchSprite(2,?Ball)
  CreateSprite(3,100,30)
  CreateSprite(4,100,30)
  LoadFont(0,"Arial",24)
  StartDrawing(SpriteOutput(3))
   DrawingFont(FontID(0))
   DrawText(0,0,"0",RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
  StartDrawing(SpriteOutput(4))
   DrawingFont(FontID(0))
   DrawText(0,0,"0",RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
  
  x_richtung=1
  y_richtung=2
  b_x=55
 
 Repeat
  Delay(20)
  
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Down)
   p1_y=p1_y+10
   If p1_y>768-100
    p1_y=768-100
   EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Up)
   p1_y=p1_y-10
   If p1_y<0
    p1_y=0
   EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Escape)
   sende(CID,"Abbruch")
   Delay(20)
   CloseNetworkServer(0)
   CloseScreen()
   End
  EndIf
  
  SEvent=NetworkServerEvent()
  If sevent=2
   *Buffer=AllocateMemory(1000)
   ReceiveNetworkData(cid,*Buffer,1000)
   p2_y=Val(PeekS(*Buffer))
   Debug "p2_y_received:"+Str(p2_y)
   Sende(CID,"P:"+Str(p1_y))
   sende(CID,"BX:"+Str(b_x))
   sende(CID,"BY:"+Str(b_y))
  EndIf
  
  If sevent=4
   CloseScreen()
   MessageRequester("!","Client disconnectet.")
   End
  EndIf
  
  Gosub moveball
  Gosub checkcrash
  Gosub drawall
 ForEver
 
 drawall:
  DisplaySprite(0,0,0)
  DisplayTransparentSprite(3,10,768-40)
  DisplayTransparentSprite(4,1024-100,768-40)
  DisplayTransparentSprite(1,5,p1_y)
  DisplayTransparentSprite(1,1024-55,p2_y)
  DisplayTransparentSprite(2,b_x,b_y)
  FlipBuffers()
 Return
 
 moveball:
  b_x=B_x+x_richtung*speed
  b_y=b_y+y_richtung*speed
  
  crash=0
  If b_x>=1024-100
   b_x=1024-100
   x_richtung=x_richtung*-1
   speed=speed+1
   crash=2
  EndIf
  
  If b_X<=0
   b_x=0
   x_richtung=x_richtung*-1
   speed=speed+1
   crash=1
  EndIf
  
  If b_y>=768-100
   b_y=768-100
   y_richtung=y_richtung*-1
  EndIf
  
  If b_y<=0
   b_y=0
   y_richtung=y_richtung*-1
  EndIf
 Return
 
 checkcrash:
 If b_x>=1024-155 Or b_x<=55
  If (SpritePixelCollision(1,5,p1_y,2,b_x,b_y) And x_richtung=-1  And crash=0) Or (SpritePixelCollision(1,1024-55,p2_y,2,b_x,b_y) And x_richtung=1 And crash=0)
   x_richtung=x_richtung*-1
  EndIf
  
  If crash=1
    Punkte_Client=Punkte_client+1
  EndIf
  
  If crash=2
   Punkte_Host=Punkte_Host+1
  EndIf
   
  StartDrawing(SpriteOutput(3))
   Box(0,0,100,30,RGB(0,0,0))
   DrawingFont(FontID(0))
   DrawText(0,0,Str(Punkte_Host),RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
  StartDrawing(SpriteOutput(4))
   Box(0,0,100,30,RGB(0,0,0))
   DrawingFont(FontID(0))
   DrawText(0,0,Str(Punkte_Client),RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
 EndIf
 Return

End

Back: IncludeBinary "Back.png"
Paddle: IncludeBinary "Paddle.png"
Ball: IncludeBinary "Ball.png"
Und hier für den Client:

Code: Alles auswählen

modus = MessageRequester("Modus wählen...","Möchten sie im Vollbildmodus spielen???",#PB_MessageRequester_YesNo)-5

InitNetwork()

OpenWindow(0,200,200,500,500,"PP :D")
StickyWindow(0,1)
EditorGadget(0,1,1,498,470)

Procedure.s username()
 s1$=GetHomeDirectory()
 i=Len(s1$)-1
 While Mid(s1$,i,1)<>"\"
  i=i-1
 Wend
 s1$=Mid(s1$,i+1,Len(s1$)-i-1)
 ProcedureReturn s1$
EndProcedure

Procedure AddL(Text$)
 AddGadgetItem(0,CountGadgetItems(0)+1,Text$)
EndProcedure

Procedure Senden(CID,Text$)
 Delay(20)
 SendNetworkString(CID,Text$)
EndProcedure

Procedure SendeInt(CID,Zahl)
 Delay(20)
 *Buffer=AllocateMemory(1000)
 PokeI(*Buffer,Zahl)
 SendNetworkData(CID,*Buffer,1000)
EndProcedure

ip$=InputRequester("Bitte IP eingeben!","IP des Hosts eingeben...","78.43.161.22")

user$=username()
addl("Verbinde...")
Delay(100)
WindowEvent()

cid=OpenNetworkConnection(ip$,6832)
If cid
 Senden(cid,"Hier ist ein Pingpong-Client, let's play a game!")
 senden(cid,"User: "+user$)
 Repeat
  WEvent=WaitWindowEvent(20)
  Delay(10)
  If WEvent=#PB_Event_CloseWindow
   CloseNetworkConnection(CID)
   End
  EndIf
   
  NEvent=NetworkClientEvent(CID)
  If nevent=2
   *buffer=AllocateMemory(1000)
   ReceiveNetworkData(CID,*buffer,1000)
   s1$ = PeekS(*buffer)
   If CountString(s1$,"User: ")
    user2$=RemoveString(s1$,"User: ")
    addl("Spieler1="+user2$)
   EndIf
   If CountString(s1$,"Speed: ")
    speed=Val(RemoveString(s1$,"Speed: "))
    addl("Speed="+Str(speed))
   EndIf
   If s1$="OK, verstanden, aufi!"
    addl("Server bestätigt, starte in 5s")
    quit=1
    t1=ElapsedMilliseconds()
   EndIf
  EndIf
  
 Until quit=1 And ElapsedMilliseconds()-t1>5000
 
;CreateFile(0,GetHomeDirectory()+"Log.txt")
InitSprite()
  InitKeyboard()
  If modus=1
   OpenScreen(1024,768,32,"Online PingPong")
  Else
   OpenWindow(1,10,10,1024,768,"PingPong by David Fritsche :P",#PB_Window_ScreenCentered)
   OpenWindowedScreen(WindowID(1),0,0,1024,768,0,0,0)
  EndIf
  UsePNGImageDecoder()  
  CatchSprite(0,?Back)
  CatchSprite(1,?Paddle)
  CatchSprite(2,?Ball)
  CreateSprite(3,100,30)
  CreateSprite(4,100,30)
  LoadFont(0,"Arial",24)
  StartDrawing(SpriteOutput(3))
   DrawingFont(FontID(0))
   DrawText(0,0,"0",RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
  StartDrawing(SpriteOutput(4))
   DrawingFont(FontID(0))
   DrawText(0,0,"0",RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
  
  x_richtung=-1
  y_richtung=2
  b_x=1024-55
 
 Repeat
 
  Delay(10)
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Down)
   p1_y=p1_y+10
   If p1_y>768-100
    p1_y=768-100
   EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Up)
   p1_y=p1_y-10
   If p1_y<0
    p1_y=0
   EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Escape)
   Delay(10)
   CloseFile(0)
   CloseNetworkConnection(CID)
   Delay(10)
   CloseScreen()
   End
  EndIf
  
  Senden(CID,Str(p1_y))
  NEvent=NetworkClientEvent(CID)
  ;WriteStringN(0,"ClientEvent: "+Str(NEvent))
  If NEvent=2
   *Buffer=AllocateMemory(1000)
   ReceiveNetworkData(cid,*Buffer,1000)
   s1$=PeekS(*Buffer)
   If CountString(s1$,"P:")
    p2_y=Val(RemoveString(s1$,"P:"))
   EndIf
   If CountString(s1$,"BX:")
    b_x=1024-Val(RemoveString(s1$,"BX:"))
   EndIf
   If CountString(s1$,"BY:")
    b_y=Val(RemoveString(s1$,"BY:"))
   EndIf
   If s1$="Abbruch"
    CloseScreen()
    MessageRequester("Abbruch:","Der Server wurde geschlossen.")
    End
   EndIf
   addl("Daten empfangen:"+s1$)
   ;WriteStringN(0,"s1$: "+s1$)
  EndIf
  
  
  Gosub moveball
  Gosub checkcrash
  Gosub drawall
 ForEver
 
 drawall:
  DisplaySprite(0,0,0)
  DisplayTransparentSprite(3,10,768-40)
  DisplayTransparentSprite(4,1024-100,768-40)
  DisplayTransparentSprite(1,5,p1_y)
  DisplayTransparentSprite(1,1024-55,p2_y)
  DisplayTransparentSprite(2,b_x,b_y)
  FlipBuffers()
 Return
 
 moveball:
  b_x=B_x+x_richtung*speed
  b_y=b_y+y_richtung*speed
  
  crash=0
  If b_x>=1024-100
   b_x=1024-100
   x_richtung=x_richtung*-1
   speed=speed+1
   crash=2
  EndIf
  
  If b_X<=0
   b_x=0
   x_richtung=x_richtung*-1
   speed=speed+1
   crash=1
  EndIf
  
  If b_y>=768-100
   b_y=768-100
   y_richtung=y_richtung*-1
  EndIf
  
  If b_y<=0
   b_y=0
   y_richtung=y_richtung*-1
  EndIf
 Return
 
 checkcrash:
 If b_x>=1024-155 Or b_x<=55
  If (SpritePixelCollision(1,5,p1_y,2,b_x,b_y) And x_richtung=-1  And crash=0) Or (SpritePixelCollision(1,1024-55,p2_y,2,b_x,b_y) And x_richtung=1 And crash=0)
   x_richtung=x_richtung*-1
  EndIf
  
  If crash=1
    Punkte_Client=Punkte_client+1
  EndIf
  
  If crash=2
   Punkte_Host=Punkte_Host+1
  EndIf
   
  StartDrawing(SpriteOutput(3))
   Box(0,0,100,30,RGB(0,0,0))
   DrawingFont(FontID(0))
   DrawText(0,0,Str(Punkte_Host),RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
  StartDrawing(SpriteOutput(4))
   Box(0,0,100,30,RGB(0,0,0))
   DrawingFont(FontID(0))
   DrawText(0,0,Str(Punkte_Client),RGB(255,50,50),RGB(0,0,0))
  StopDrawing()
 EndIf
 Return
EndIf
End

Back: IncludeBinary "Back.png"
Paddle: IncludeBinary "Paddle.png"
Ball: IncludeBinary "Ball.png"
Und die Bilder wer will...
http://img251.imageshack.us/g/backlr.png/

Ich hoffe ihr könnt mir helfen!!! Habs echt 10000x mit Freunden probiert :(
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Antworten