Seite 2 von 2

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 17:19
von Sunny
die sache is ja die... ich könnte ja auch meinen computer als server verwenden, allerdings müsste er dann 24 std. rund um die uhr online sein und außerdem hab ich nur nen i-net-stick und an dem ding krieg ich keinen port geöffnet.

ich komm jetzt einfach mal zu ner älteren frage zurück, würde es auch reichen, den server in die (Windows-)Firewall als ausnahme einzutragen, oder würden die daten dann trotzdem nicht versendet btw. empfengen werden?
oder würde es gehen, wenn ich nur in der Firewall einen port frei gebe?

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 17:20
von STARGÅTE
Sunny hat geschrieben:ja, aber ich würde trotzdem lieber die Send- und Receive-Funktionen nutzen...
natürlich benutzt du die weiterhin :? wie willst du denn sonst mit dem Server komunizieren ?

Du baust ganz normal n Verbindung auf mit OpenNetworkConnection() zu deinem Server wo zB php ist.
und sendest dann Daten/Befehle mit SendNetworkString()
und empfängst dann ankommenden Daten mit ReceiveNetworkData()

Da gibts kein unterschied zum "normalen" Client-Server verhalten, nur das du halt über das HTTP-Protokoll gesteuert wirst.
Improvisation ist das ganz und garnicht.

Codes zum senden von POST via HTTP findest du hier im Forum ...

Ansonst noch n neue Variante:

Du erstellst ein Chat der erst nach einem Server sucht mit dem er sich verbinden kann (IP-Liste lege dabei auf einem php-Server) wenn er ein findet nutzt er den, ansonst wird er selber zum server ....

EDIT:
Wenn du direkt ins Netzt geht ja, ansonst musst du/die benutzer den Port auch auf dem Rooter freigeben.

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 17:25
von Tombi
Sunny hat geschrieben:die sache is ja die... ich könnte ja auch meinen computer als server verwenden, allerdings müsste er dann 24 std. rund um die uhr online sein und außerdem hab ich nur nen i-net-stick und an dem ding krieg ich keinen port geöffnet.
Heim-Rechner sind für sowas eigentlich nicht geeignet...
Die Internetleitung wäre in den meisten Fällen zu schwach.

Zum Thema Internet-Stick:
1. Zum langsam
2. Zu instabil
3. Keine Ports lassen sich öffnen...
Komm garnicht erst auf die Idee :D

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 17:31
von Sunny
Heim-Rechner sind für sowas eigentlich nicht geeignet...
Die Internetleitung wäre in den meisten Fällen zu schwach.

Zum Thema Internet-Stick:
1. Zum langsam
2. Zu instabil
3. Keine Ports lassen sich öffnen...
Komm garnicht erst auf die Idee :D
Genau deswegen hab ich mir auch die frage gestellt, ob man Clienten direkt miteinander verbinden kann :D
Du baust ganz normal n Verbindung auf mit OpenNetworkConnection() zu deinem Server wo zB php ist.
und sendest dann Daten/Befehle mit SendNetworkString()
und empfängst dann ankommenden Daten mit ReceiveNetworkData()
Hört sich interessant an, aber auch ziemlich kompliziert (zumindest für mich :lol: )...
Wenn ich das richtig verstanden habe, muss ich dazu noch ein passendes php-script schreiben, oder?

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 17:58
von STARGÅTE
Das müsstest du so oder so,
denn wenns so wie ICQ oder so werden soll, haben die Benutzer ja Kontaktlisten, diese werden auf dem Webspace gespeichert (MYSQL)

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 18:03
von Sunny
joar... haste recht.
dann schau ich mal, ob ich das so realisiert kriege...

danke für eure hilfe

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 03.08.2010 20:31
von Dark
Hallo,

dies ist doch ein klassicher Fall für ein Peer-to-Peer System. Hierbei besteht die Möglichkeit, wenn man ein UDP System verwendet, mithilfe des sogennanten Hole Punchings, sich ein Loch durch die Firewalls und Router zu bohren.
Dies funktioniert folgendermaßen: Das UDP Protokoll ist Stateless. Es kennt keinen Zustand wie Verbunden oder nicht verbunden, folglich kann man auch nicht mit jemanden Verbunden sein. Sendet man nur ein Packet zu einem Client/Server, öffnet der Router nach draußen einen Port. Auf diesem Port können nun Packete von jedem beliebigen anderen Client empfangen werden. Das einzige Problem ist nur, das man nicht weiß welchen Port der Router nach draußen öffnet. Hierfür benötigt man dann einen kleinen UDP Server, welcher einem mitteilt auf welchem Port man sendet. Nachdem man nun seinen Port kennt, kann man diesen und seine IP Adresse an andere weiter geben (könnte noch in den kleinen Server mit eingebaut werden) und kann dann ganz normal kommunizieren.

Das Problem daran ist, das PureBasic leider keine möglichkeit bei UDP eingebaut hat, an beliebige IP Adressen Packete zu versenden. Aus diesem Grund brauch man eine direkt API Lösung für P2P. Das ganze ist aber auf jedenfall möglich, da ich diese Technik schon in vorherigen Projekten verwendet habe.

mfg,
Dark

Re: Netzwerk-Clienten direkt miteinander verbinden

Verfasst: 06.08.2010 21:50
von Mòròs
Das ist ein schnellen beispiel ein kleine chat programm^^
// Client Code======================================
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf


OpenConsole()

Port = 1234
IP.s = "192.168.1.33"

Buffer = AllocateMemory(1000) ; Speicher reservieren, Buffer ist die Speicheradresse

ConnectionID = OpenNetworkConnection(IP, Port); Stellt verbindung zum Server her.

If ConnectionID ; Wenn verbindung hergestellt, dann geht er in die hauptschleife.
Repeat
Text.s = InputRequester("Text schicken", "geben sie den Text ein, der geschickt werden soll:", "")
PokeL(Buffer, Len(Text)) ; Schreibt die Länge des Textes in den Buffer, Damit der auf der anderen Seite weiss, wieviel er auslesen muss.
PokeS(Buffer+4, Text) ; Schreibt den Text in den Buffer (Achtung, es muss Buffer+4 sein, weil man sonst die Länge überschreibt (ein Long hat 4 bytes))
SendNetworkData(ConnectionID ,Buffer , 4 + Len(Text)) ; Sendet den Buffer an den Server. (4 + Len(Text) weil man erst die Länge schickt, und dann den Text)
Print("abgeschickt. 5 Sekunden warten um neue Nachricht abzuschicken, oder einfach Fenster schliessen!")
Delay(50000)
Until Ende = 1
CloseNetworkConnection(ConnectionID)
Else
PrintN("Server konnte nicht erstellt wurde.")
EndIf
End


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


OpenConsole()

Port = 1234

Buffer = AllocateMemory(512) ; Speicher reservieren, Buffer ist die Speicheradresse

If CreateNetworkServer(0, Port) ; erstellt den Server mit dem Port "Port"
PrintN("Server erstellt, alles bereit!")
; ##################################### Hauptschleife ##########################################

Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case 1
PrintN("Neuer Client hat sich verbunden. Die ID von ihm ist:"+Str(ClientID))

Case 2
ReceiveNetworkData(ClientID, Buffer, 4) ; Schreibt empfangene Daten in den Buffer "Buffer"
Len = PeekL(Buffer) ; Liest ein Long aus dem Buffer aus. der soll zeigen wie Lange der Text ist
ReceiveNetworkData(ClientID, Buffer, Len) ; Schreibt empfangene Daten in den Buffer "Buffer" mit der Länge von "Len"
PrintN(PeekS(Buffer, Len)) ; Liest den String aus dem Buffer. die Länge ist auch die Variable "Len"

Case 3
; ############ Hier wird eine Datei empfangen, braucht man aber eigentlich nicht

Case 4
PrintN("Client hat sich getrennt. Die ID von ihm ist:"+Str(ClientID))

EndSelect
EndIf

Delay(10) ; um den Prozessor zu entlasten.

Until Ende = 1 ; Eigentlich sollte hier das Programm Enden. Macht es aber nicht, weil "Ende" nie 1 sein wird.

CloseNetworkServer(0)

Else
PrintN("Server konnte nicht erstellt wurde.")
EndIf



Viel Spaß