TCP-Stream wird nicht erkannt

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

oware

Betreff: TCP-Stream wird nicht erkannt

BeitragSa, März 24, 2007 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe folgendes Problem:

Code: [AUSKLAPPEN]
stream = CreateTCPServer(8080)
Repeat
   Cls
   While Not Eof(stream)
      Print ReadLine(stream)
   Wend
   Flip
Until KeyDown(1)


Ich habe hier mal einfach einen Server erstellt, und wollte die Daten auslesen, die reinkommen (ich weiß, HIER kommt nix rein weils keinen Client gibt Wink). Aber bei mir heißt es im Debugger dann in der Zeile
While not eof(stream):
"Stream does not exist"

Kann ein Server seinen eigenen Stream nicht auslesen??

TIA oware
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt

pixelshooter

BeitragSa, März 24, 2007 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
"stream" ist einfach kein stream, sondern ein server Wink
per AcceptTcpStream lädst du aus einer NEUEN server-client verbindung den stream
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

oware

BeitragSa, März 24, 2007 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
aber wie kann ich dann als Host daten auslesen?

Kannst du mir mal ein Bsp schreiben?
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt

pixelshooter

BeitragSa, März 24, 2007 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
server = createtcpserver(80)
repeat
     stream = accepttcpstream(server)
until stream
byte = readbyte(stream)


accepttcpstream liefert einen stream zurück, sobald eine neue verbindung aufgebaut wird, wenn du also nich speicherst, sondern wieder accepttcpstream ausführst, geht die verbindung verloren.
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

oware

BeitragSa, März 24, 2007 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
achso. Dann braucht man aber für jeden Client einen eigenen Stream, oder? (Ich weiß, langsam nervts bestimmt...)
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt

TheMatrix

BeitragSa, März 24, 2007 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, jeder Client baut 2 Streams auf. Ein Stream und den Server Daten zu senden, sowie ein Stream zum Empfangen. Der Server braucht auch nur 2. Ebenfalls einen zum Empfangen und zum senden. Ist eigentlich recht simple, wenn man n bischen übt.
°_° °.° °~° °v° .. -.-

pixelshooter

BeitragSa, März 24, 2007 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
reicht nicht ein stream für die kommunikation??
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

StepTiger

BeitragSa, März 24, 2007 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
nicht für den server. Bei TCP reicht ein Stream für den Clienten sowohl zum Senden als auch zum Empfangen aus.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

pixelshooter

BeitragSa, März 24, 2007 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
man lernt nie aus Very Happy
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

TheMatrix

BeitragSo, März 25, 2007 1:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, eigentlich schon, aber wenn nun andere Clienten direkt mit dem Clienten, kommunizieren ist es schon besser 2 zu haben, wenn der Client nun trotzdem noch mit dem server kommunizieren soll.
°_° °.° °~° °v° .. -.-

Smily

BeitragSo, März 25, 2007 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Client mit Client kann man nicht Kommunizieren lassen.

Ich würde dir Empfehlen für "Experimente und Tests" einen Server auf Port 80 zu verwenden.
Das hat den Vorteil, dass du nicht auch noch einen Clienten schreiben musst, dafür kannst du dann einfach einen X-Beliebigen Browser nehmen.

Beispiel:
Code: [AUSKLAPPEN]
svr = CreateTCPServer(80)
Print "Server"
Repeat
 Stream = AcceptTCPStream(svr)
 If Stream
  Repeat
   z$ = ReadLine(stream)
   Print z$
  Until z$ = "" Or Eof(stream)
  c = c + 1

  WriteLine stream, "Hallo du da."
  CloseTCPStream(stream)
 End If
Forever


Edit: The Matrix. Es wäre mir neu, dass man einen Clienten direkt mit einen Anderen Clienten Kommunizieren lassen kann. Confused Imho MUSS doch irgendwie ein Server dazwichen sein, oder?
Korrigier mich bitte, wenn ich falsch liege, pixelshooter sagte ja berreits man lernt nie aus ^^
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

TheMatrix

BeitragSo, März 25, 2007 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja kla sicher, aber es wäre doch genauso möglich, dass sich 2 Clienten auf einem Server melden und der ihnen beide den Port geben, auf den die beiden Clienten hören. So könnte sich ein Client mit einem anderen direkt unterhalten. Aber natürlic muss halt immer n Server dafür laufen.
°_° °.° °~° °v° .. -.-

oware

BeitragSo, März 25, 2007 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
schön, dass so viele Antworten kommen Smile

Erstmal danke an alle die hier geholfen haben, ich probier dann mal rum Smile
www.myspace.com/oliverpuetz -> Mein Instrumentalprojekt

Vertex

BeitragSo, März 25, 2007 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
oware:
Im Server legst du dir am besten ein Type TClient an. Verbindet sich ein Client mit dem Server, speicherst du den Stream von AcceptTCPStream in eine Instanz von TClient. Der Type hat den Vorteil, dass die Instanzen intern als doppelt verkettete Liste gespeichert werden.

Du gehst also mit einer For-Each-Schleife alle Clients durch, schaust mit ReadAvail, ob Pakete zum lesen vorhanden sind, und liest ggF. in While Not Eof(Client\Stream) ... Wend aus.

Für mich völlig unklar, aber ich habe noch keine Möglichkeit gefunden zu prürfen, ob eine Verbindung überhaupt noch steht zum Client. If Eof(Client\Stream) = -1 Then ... reagiert nicht auf ein Disconnect. Theoretisch könntest du nach einen Disconnect einfach den Client aus der Liste mittels Delete Client löschen.

Die Beispiele, wie sie im Tutorial, in der OH und auch bei Smily0412 zu finden sind, sorgen für Verwirrung.

TheMatrix: Was du da beschreibst, ist Quatsch. Kommuniziert wird mit dem Server über einen Port. Wenn Daten von einem Client zum anderen übertragen werden sollen, so muss dies der Server regeln. Dafür muss man Protokolle entwerfen.

mfg olli
vertex.dreamfall.at | GitHub

StepTiger

BeitragSo, März 25, 2007 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Vertex, mach es so, wie ich. Ich verlange vom Clienten mittels einer Nachricht einen PING befehl. Nun misst der Server die Zeit, bis eine Antwort kam, und weiß gleich die Ping mit. Sollte nach 3 sekunden keine antwort da sein, wird die verbindung geschlossen.

Zu der Sache mit dem Browser:
Man kann auch ganz andere Ports mit dem Browser anzeigen lassen. Dafür dient der :. Beispiel:
"127.0.0.1:8080"
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

TheMatrix

BeitragSo, März 25, 2007 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@Vertex
Quatsch ises, aber mögliche Wink Wollt halt nur sagen, dass es gehen würde, aber natürlich nicht so realisiert wird. Ich weiß selber, dass man Protokolle entwerfen muss.
Das mit dem Timeout kann man auch besser lösen. Gebe TClient das Feld pingtimer. Frage in einer schleife ab, ob millisecs()>=Client\Pingtimer ist. Wenn ja, dann delete Client. Pingtimer wird ständig aktualisiert, wenn der Server eine Meldung von dem Clienten erhält, was wiederum der Client dadurch handeln kann, dass er z.B. alle 5Sek ein Ping sendet. Dadurch wird auch gleich getestet, ob der Server überhaupt noch Online ist.
°_° °.° °~° °v° .. -.-

StepTiger

BeitragSo, März 25, 2007 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich das nicht in etwa so gesagt?

Deins ist übrigens sehr sinnlos. Es ist nicht nötig, jeden Schleifendurchlauf zu pingen. Es ist nahezu unmöglich, dass innerhalb eines Schleifendurchlaufs eine Antwort kommt.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Vertex

BeitragSo, März 25, 2007 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist schon klar, dass man das über Ping o.ä. lösen kann. Jedoch ist das nicht Aufgabe der Anwender-Schicht sondern ist schon in TCP fest verankert. Das man mit Blitz keinen Zugriff darauf hat, ist wie gesagt unverständlich. In Protokollen der oberen Schicht, wie HTTP, kann man nicht einfach mal ein Ping einführen. Das verstehen Server/Clients einfach nicht. Deswegen finde ich es ziemlicher Schrott, wenn es keine andere Möglichkeit gibt. Bei den Berkleysockets(darauf basiert ja Blitz) gibt es keinen direkten Befehl zum Prüfen der Verbindung, aber es gibt Möglichkeiten.

Hier meine Testprogramme:

Server
Code: [AUSKLAPPEN]
Global Server%, Stream%, Client.TClient, Message$, Ln$

Type TClient
   Field Stream%
   Field Name$ ; Nur ein Platzhalter für später
End Type

AppTitle "TCP Server"
Print "TCP Server"

TCPTimeouts(2000, 2000)
Server = CreateTCPServer(80)
If Not Server Then
   Print "Can't create server"
   End
EndIf

While Not KeyDown(1)
   Stream = AcceptTCPStream(Server)
   If Stream Then
      Print "New client hast connected:"
      Print " IP: " + DottedIP(TCPStreamIP(Stream))
      Print " Port: " + TCPStreamPort(Stream)
      
      Client = New TClient
      Client\Stream = Stream
      Client\Name = "Blub"
   EndIf

   For Client = Each TClient
      If Eof(Client\Stream) = -1 Then
         Print "Client has disconnected:"
         Print " IP: " + DottedIP(TCPStreamIP(Client\Stream))
         Print " Port: " + TCPStreamPort(Client\Stream)
         
         Delete Client
      Else
         If ReadAvail(Client\Stream) Then
            Print "Package from"
            Print " IP: " + DottedIP(TCPStreamIP(Client\Stream))
            Print " Port: " + TCPStreamPort(Client\Stream)
            
            Message = ""
            While Not Eof(Client\Stream)
               Ln$ = ReadLine(Client\Stream)
               Print ">" + Ln$
               Message = Message + Ln + Chr(13) + Chr(10)
            Wend
            If Message Then Message = Left(Message, Len(Message) - 2)
            
            WriteLine(CLient\Stream, "OK: " + Message)
         EndIf
      EndIf
   Next
Wend

CloseTCPServer(Server)
End


Client:
Code: [AUSKLAPPEN]
Global Stream%

AppTitle "TCP Client"
Print "TCP Client"

TCPTimeouts(2000, 2000)
Stream = OpenTCPStream(Input("ServerIP: "), 1234)
If Not Stream Then
   Print "Can't create client"
   End
EndIf

While Not KeyDown(1)
   If Eof(Stream) = -1 Then
      Print "Server has disconnected"
      Exit
   EndIf

   If ReadAvail(Stream)
      Print "Package from Server"
      While Not Eof(Stream)
         Print ">" + ReadLine(Stream)
      Wend
   EndIf

   Message$ = Input("Message: ")
   If Message$ = "exit" Then Exit
   WriteLine(Stream, Message)
Wend

WaitKey()
CloseTCPStream(Stream)
End


Blitz stürzt mir jetzt immer ab, um etwas dazu zu sagen. Naja, mir egal. Ich habe BMax, ein besseres, selbst geschriebenes Netzwerkmodul und da läuft alles erste Sahne.

mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group