Seite 1 von 1

Server und Client Problem

Verfasst: 18.05.2007 22:35
von C4rizz
Hi
ich hab mich mal bissl mit Server und Clients beschäftigt und bin abei auf diese 2 Examples ausm Code Archiv gestoßen.
Aber leider lässt sich nur im Netzwerk mit anderen Pc eine Verbindung herstellen über die Netzwerkip.
Leider geht es nicht wie angegeben übers Internet.
Wie kann also ein andere Pc übers Internet auf meinen erichteten Server zugreifen?

Hier mal die beiden Codes:

Server:

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=14314&highlight=
; Author: HeX0R (updated for PB 4.00 by Andre)
; Date: 08. March 2005
; OS: Windows
; Demo: Yes


; Sending a string via Internet (TCP/IP connection) 
; This is the server! Look for the related client code example!

InitNetwork() 
If ExamineIPAddresses() 
  IP.l = NextIPAddress() 
EndIf 
*buffer = AllocateMemory(2000) 
If CreateNetworkServer(0, 6654) 
  OpenConsole() 
  PrintN("Server Online Listening on IP (" + IPString(IP) + ")") 
  Repeat 
    Select NetworkServerEvent() 
      Case 0 
        If Left(Inkey(), 1) = Chr(13) 
          Quit = 1 
        EndIf 
        Delay(5) 
      Case 1 
        PrintN("Ein neuer Client hat Connectet") 
        ClientID.l = EventClient() 
      Case 2 
        length.l = ReceiveNetworkData(ClientID, *buffer, 2000) 
        String$ = PeekS(*buffer, 2000) 
        PrintN("Received:" + String$) 
    EndSelect  
  Until Quit = 1 
EndIf 
FreeMemory(*buffer) 
End 
Client:

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=14314&highlight=
; Author: HeX0R (updated for PB 4.00 by Andre)
; Date: 08. March 2005
; OS: Windows
; Demo: Yes


; Sending a string via Internet (TCP/IP connection) 
; This is the client! Look for the related server code example,
; which must be started first!

If InitNetwork() = 0 
  MessageRequester("Error", "Error") 
EndIf 
ip$ = InputRequester("","bitte server ip eingeben!","") 
Debug ip$ 
ConnectionID = OpenNetworkConnection(ip$, 6654) 
If ConnectionID 
  OpenConsole() 
  PrintN("Erfolgreich zum server Verbunden") 
  String$ = InputRequester("","String zum versenden eingeben","") 
  If String$ 
    SendNetworkData(ConnectionID, @String$, Len(String$)) 
  EndIf 
  Input() 
Else 
  Debug "error" 
EndIf 

End 
Thx schonmal für die Antworten. :)

Verfasst: 18.05.2007 22:38
von a14xerus
Du musst die Ip deines Serverprograms wissen, bwz des Inet-Anschlusses, auf dem das Prog läuft.

Code: Alles auswählen

Procedure.l DownloadToMem ( URL.s, *lpRam, ramsize.l ) 
  Protected agent.s, hINet.l, hData.l, Bytes.l 
  agent = "Mozilla/4.0 (compatible; ST)" 
  hINet = InternetOpen_(@agent,0,0,0,0) 
  hData = InternetOpenURL_(hINet,@URL,"",0,$84000000,0 ) 
  If hData > 0 : InternetReadFile_ ( hData, *lpRam, ramsize, @Bytes ) : Else : Bytes = -1 : EndIf 
  InternetCloseHandle_ (hINet) : InternetCloseHandle_ (hFile) :  InternetCloseHandle_ (hData) 
  ProcedureReturn Bytes 
EndProcedure 

IP.s = Space ( 256 )

If DownloadToMem ( "http://checkip.dyndns.org", @IP, 256 ) > 0 
  IP$ = Trim(StringField(StringField( IP, 2, ":" ),1,"<")) 
  InputRequester("IP - (C) Alexander N","Deine IP ist:",IP$)
EndIf

Verfasst: 18.05.2007 23:26
von C4rizz
Mhm danke aber funzt trozdem net...
Als info noch ich benutz nen router! kann das sein das da irgendwelche Ports erst freigegeben werden müssen?

Verfasst: 19.05.2007 13:26
von Jilocasin
Ja du musst den Port an deinen PC, also deine "interne" Netzwerk-IP weiterleiten.
Das geht meistens irgendwo unter "Portfreigabe" in der Router-Oberfläche.

In diesem Fall wäre es bei dir Port 6654

Ungefähr so...
Bild

Verfasst: 19.05.2007 17:29
von C4rizz
Kanns jetzt grad nich ausprobieren aber scheint zu klappen :mrgreen:
Vielen Vielen, Dank nach mehreren Stunden arbeit endlich mal ein Hoffnungsschimmer^^
Aber eine Frage abschließend hab ich noch und zwar, muss nur der Server Pc den jeweiligen Port freigegeben haben oder auch der Client?
Ich geh mal davon aus des es nur der Server haben muss...oder?

Ansonsten Vielen Dank für die Hilfe :allright:

Verfasst: 19.05.2007 18:03
von C4rizz
Habs schon rausgefunden.
Es muss nur der Server Pc den Port freigegeben haben.

Verfasst: 19.05.2007 23:24
von C4rizz
Sry nochne frage ich post ma hier rein weil es ja zusammenhängend ist.
Und zwar

Wenn ich die beiden Codes Ausprobiere:

Server

Code: Alles auswählen

InitNetwork()
If ExamineIPAddresses() 
  IP.l = NextIPAddress() 
EndIf 
*buffer = AllocateMemory(2000)
CreateNetworkServer(0,6088)
  OpenConsole() 
  PrintN("Server Online Listening on IP (" + IPString(IP) + ")") 
  Repeat 
    Select NetworkServerEvent() 
      Case 1 
        PrintN("Ein neuer Client hat Connectet") 
        ClientID.l = EventClient() 
      Case 2 
        length.l = ReceiveNetworkData(ClientID, *buffer, 2000) 
        String$ = PeekS(*buffer,2000) 
        PrintN("Received:" + String$)
    EndSelect  
  Until Quit = 1 

FreeMemory(*buffer) 
End
Client:

Code: Alles auswählen

InitNetwork()

ip$ = InputRequester("","Einfach OK drücken.","77.179.219.69") 
ConnectionID = OpenNetworkConnection(ip$,6088) 
If ConnectionID 
  String$ = InputRequester("","Bitte gib mal was ein.","") 
  If String$ 
    SendNetworkData(ConnectionID, @String$, Len(String$)) 
  EndIf  
EndIf 
Funktioniert alles bestens aufm server wird angezeigt Client ist hinzugekommen und der text des Clients.

Aber wenn ich nun dieses Serverprog hier benutze:

Code: Alles auswählen

InitNetwork()

  #Window = 0
  #Editor = 1
  #Eingabe = 2
  #enter = 3
  #ESCape = 4

OpenWindow(#Window,0,0,522,172,"CHAT",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_BorderLess)
  CreateGadgetList(WindowID(#Window))
    EditorGadget(#Editor,10,10,500,120,#PB_Editor_ReadOnly)
    SetGadgetText(#editor,"Wilkommen")
    StringGadget(#Eingabe,10,140,500,20,"")

  *buffer = AllocateMemory(2000)
  CreateNetworkServer(0,6088)
  
Repeat
event = WaitWindowEvent()

Select NetworkServerEvent() 
  Case 1 
    AddGadgetItem(#editor,-1,"Ein neuer Client hat Connectet") 
    ClientID.l = EventClient()
  Case 2
    length.l = ReceiveNetworkData(ClientID,*buffer,2000) 
    String$ = PeekS(*buffer,2000) 
    AddGadgetItem(#editor,-1,"Client : " + String$)
EndSelect 

If event = #PB_Event_CloseWindow:End:EndIf
ForEver
Und dann den Client auf dieses Serverprog benutze wird komischweise nur das Client hinzugekommen angezeigt, der Text des Clients jedoch nicht.
Kann mir einer sagen woran das liegt?
Ich bin ratols, mit der Console klappt alles und komischweise emüfängt das NetworkServerEvent() nur #PB_NetworkEvent_Connect , #PB_NetworkEvent_Data jedoch nicht o.O

Sry aber bin echt total neu auf dem Netzwerk/Internetgebiet...

Verfasst: 20.05.2007 16:01
von C4rizz
Weiss den keiner warum das nicht geht?

Verfasst: 20.05.2007 16:37
von edel
Du laesst dem Clienten nicht genug Zeit, zum testen kannst du mal
am Ende des Clienten nen Delay(12345) setzen.

Verfasst: 20.05.2007 17:43
von C4rizz
YEA es geht! :allright: Danke