TCP-Probleme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Donald Agu

Betreff: TCP-Probleme

BeitragDi, Nov 14, 2006 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber da die Tutorials leider unzureichend sind, muss ich nun doch nochmal eine kleine Fragerunde eröffnen:

Also, ich spreche vom Fall mit 2 über TCP vernetzten PCs.

Nachdem Server mit Client verbunden ist, werden dann beide Seiten gleich behandelt? Sprich: funktioniert das Versenden von Nachrichten dann identisch oder muss man da variieren? Denn wenn ich vom Server aus verschicken möchte, bekomme ich öfters mal "Stream does not exist" zu hören.

Ferner heißt es in der Onlinehilfe, dass der Befehl "AcceptTCPStream" nur dazu zu benutzen ist, um "neue Verbindungen aufzuspüren". Das ist mir so gar nicht klar.
Denn man erhält zwar für die Variable eine ID-Nr., diese unterscheidet sich jedoch von der des anderen PCs (was mir wiederum unerklärlich ist). Question

Außer dem wird der Befehl sogar im Onlihehilfe-Beispiel verwendet, um eine achricht auszulesen, sehr komisch Confused .

Ist es nun ein Irrtum von mir, zu denken, dass ich mich um nichts besonderes mehr kümmern muss, nachdem ich server und client festgelegt und verbunden habe ode nicht?

Bitte helft mir weiter! Wer mir das ganze Prinzip mal erklären will, so dass man es auch versteht, dem Back ich mal nen Kuchen, wenn er mal nach Lohr a. Main kommt Very Happy .

Vielen Dank

AGU

Kryan

BeitragDi, Nov 14, 2006 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Nachdem Server mit Client verbunden ist, werden dann beide Seiten gleich behandelt?


Ja, zumindest, wenn sie erstmal verbunden sind Wink

Die Serverseite kann ja mit mehreren Clienten "Kontakt" aufnehmen. So läuft es in etwa ab:

1. Server wird aktiviert
2. Client meldet sich beim Server
3. Server bemerkt den Clienten via AcceptTCPStream
4. Server benutzt die von AcceptTCPStream zurückgegebene ID-Nr., um den Clienten zu kontaktieren
5. Client benutzt die von OpenTCPStream zurückgegebene ID-Nr., um den Server zu kontaktieren

Dabei sehen die Kontaktaufnahmen bei 4. und 5. identisch aus Wink
Also mit WriteByte, ReadByte etc.
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

Donald Agu

BeitragMi, Nov 15, 2006 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
O.K., aber warum funktioniert dann dieses Programm nicht, bei dem der Server erst 3 Zahlen eingibt, die beim Client erscheinen sollen, und dann das gleiche Spiel umgekehrt?

Server:
Code: [AUSKLAPPEN]

server = CreateTCPServer(8000)
If server <> 0
Print "Server erfolgreich gestartet."
EndIf
n = CountHostIPs("")
ipnr = HostIP(1)
ip$ = DottedIP$(ipnr)

Print "Eigene IP: " + ip$
Print "Verbinde...(Abbruch mit <esc>)..."
While Not KeyHit(1) Or stream <> 0
stream = AcceptTCPStream(server)
Wend

Print
Print "Verbunden oder mit <esc> abgebrochen!" ; klingt verwirrend, meint aber nur, dass die Rechner verbunden sind, sofern nicht <esc> gedrückt wurde

Print

Dim aaa(20)
For j = 1 To 20
aaa(j) = ReadByte(stream)
Next

Dim x(3)

For a = 1 To 3
x(a) = Input("Geben sie eine Zahl ein: ")
WriteByte stream,x(a)
Next

Dim y(3)
b = 1

While Not b = 4
y(b) = ReadByte(stream)
If y(b) <> 0
b = b + 1
EndIf
Wend

For a = 1 To 3
Print "Gegenüber gibt ein: " + y(a)
Next

CloseTCPServer server
Print "O.K. Programm ist zu Ende <TASTE>"
WaitKey()


Client:
Code: [AUSKLAPPEN]

ip$ = Input("Gib die IP des Servers an: ")

Print "Verbindungsversuch...(Abbruch mit <esc>)"

While Not KeyHit(1) Or stream <> 0
stream = OpenTCPStream(ip$,8000)
Wend

Print
Print "Verbunden oder mit <esc> abgebrochen!"
Print

Dim aaa(20)
For j = 1 To 20
aaa(j) = ReadByte(stream)
Next

Dim y(3)
b = 1

While Not b = 4
y(b) = ReadByte(stream)
If y(b) <> 0
b = b + 1
EndIf
Wend

For a = 1 To 3
Print "Gegenüber gibt ein: " + y(a)
Next

Print

Dim x(3)

For a = 1 To 3
x(a) = Input("Geben sie eine Zahl ein: ")
WriteByte stream,x(a)
Next

CloseTCPStream stream
Print "O.K. Programm ist zu Ende <TASTE>"
WaitKey()

Kryan

BeitragMi, Nov 15, 2006 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
While Not b = 4
y(b) = ReadByte(stream)
If y(b) <> 0
b = b + 1
EndIf
Wend


Davor solltest du folgendes schreiben:
Code: [AUSKLAPPEN]
Repeat:Until ReadAvail(stream)
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

Donald Agu

BeitragMi, Nov 15, 2006 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm... aber das würde doch bedeuten, dass der fehler daraus resultiert, dass der "suchvorgang" (so nenn ich ihn jetzt einfach mal) nach empfangenen Dateien zu schnell "abgebrochen" wird. Ansonsten müsste es ja funktionieren. Der Fehler liegt bestimmt woanders, oder? Question

Ich probiers auf jeden Fall mal aus und bedanke mich fürs erste

Very Happy

~EDIT~

Hat leider net geklappt, schade Crying or Very sad .

Besonders beängstigend finde ich ja, dass die beiden Variablen "stream" (vom server mit AcceptTcpStream und vom Client mit OpenTcpStream bestimmt) nicht identlisch sind. Das ist meiner Vermutung nach auch der Grund, warum das verflixte Programm net läuft, wie ich mir das vorstelle Confused

Ich bin mir aber nicht sicher und kann es auch nicht nachprüfen. Weiß jemand von euch vielleicht Rat? Wink

THX

AGU

Kryan

BeitragMi, Nov 15, 2006 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
warum sollten die streams gleich sein Very Happy ??
Aso, und mit meinem letzten Post lag ich falsch, weil er immer so lange wartet, bis die Bytes empfangen werden (deshalb ist TCP nicht für ein MMORPG geeignet)

Aber ich hoffe, dass ich jetzt den Fehler habe:

Auf Serverseite hast du irgendwo das stehen:

Code: [AUSKLAPPEN]
Dim aaa(20)
For j = 1 To 20
aaa(j) = ReadByte(stream)
Next


Und auf Clientseite das da:

Code: [AUSKLAPPEN]
Dim aaa(20)
For j = 1 To 20
aaa(j) = ReadByte(stream)
Next


Dabei steht davor, AUF BEIDEN SEITEN!!, kein WriteByte...
So was passiert nun, wenn beide Seiten irgendwas lesen wollen, was nicht geschrieben worden ist? Nichts, rein gar nichts, weil halt nichts geschrieben worden ist Razz

Ich hoffe du verstehst Smile
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

Donald Agu

BeitragMi, Nov 15, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
nene, du hast da scheinbar was übersehen Laughing Wink

das programm soll wechselseitig funktionieren. D.h. erst gibt der Server 3 Zahlen ein, die beim Client ausgelesen werden, dann umgekehrt.
Die schleife, die du als falsch erkannt hast, ist vermutlich völlig überflüssig. ich hab sie nur eingebaut, weil ich damit den speicher "leeren" wollte und so verhindern wollte, dass ich anstelle der eingegebenen Zahlen irgendeine komische ID, die ja denk ich auch über den stream versendet wird, erhalte.

War vermutlich ein irrtum... Rolling Eyes

Ich hab mein Programm inzwischen modifiziert, und nun funktioniert es BIS JETZT so ungefähr wie ich mir das vorstelle:

server:
Code: [AUSKLAPPEN]

server = CreateTCPServer(8000)
n = CountHostIPs("")
ipnr = HostIP(1)
ip$ = DottedIP$(ipnr)
Print "Server gestartet."
Print "IP-Adresse: " + ip$
Print "Verbinde..."
While Not KeyHit(1) Or stream <> 0
stream = AcceptTCPStream(server)
Wend
Print
Print "Verbunden!"
Print
While Not KeyHit(1)
x = Input("Gib was ein: ")
WriteByte(stream,x)
Wend


Client:
Code: [AUSKLAPPEN]

ip$ = Input("Gib die IP des Servers ein: ")
Print "Verbinde..."
While Not KeyHit(1) Or stream <> 0
stream = OpenTCPStream(ip$,8000)
Wend
Print
Print "Verbunden!"
Print
While Not KeyHit(1)
byte = ReadAvail(stream)
If byte <> 0
x = ReadByte(stream)
Print x
EndIf
Wend


Jetzt erscheinen die zahlen, die der server eingibt, beim client auf dem screen. Mehr wollte ich gar nicht.

Falls irgendwann damit mal was nicht funktioniert, melde ich mich wieder (kann ja eigentlich nicht lang dauern) Embarassed .

Wenn du lust hast, kannst du ja den fehler noch suchen, ist vielleicht auch ganz interessant, die sache Wink .

Ich bedank mich jedenfalls schonmal herzlich für deine Hilfe

AGU Very Happy

Kryan

BeitragMi, Nov 15, 2006 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
nana...bisschen hast ja geschummelt ^^

im oben von dir hingeschriebenen Code hast du aber nichts vor ReadByte geschrieben....du SCHUMMLER Razz

PS: ich hoffe ich krieg noch einen Kuchen Smile
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

Donald Agu

BeitragDo, Nov 16, 2006 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt. Da hatte ich nix von Readavail geschrieben, das habb ich aber auch nie behauptet. Smile
Dass besagte Schleifen überflüssig sind, hat sich inzwischen bestätigt. Und dass ich das Readavail von dir hab, daraus mach ich keinen Hehl. Schließlich hab ich mich ja DAFÜR bedankt Very Happy

Hoffentlich hast du kein Patent auf den befehl, sonst muss ich das wohl irgendwie umgehen...HILFE!! Rolling Eyes

Was hältst du von nem Guglhupf? Mit Schoki oder ohne? Wink

Kryan

BeitragDo, Nov 16, 2006 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Klingt gut, hab noch nie einen Guglhupf gegessen Smile

Ehm: Ich hab nichts über ReadAvail gesagt (also in meinem letzten post zumindest nicht)...vielmehr über ReadByte...aber ist ja jetzt auch egal, weil du es bei deinem neuen code ja nun richtig hast Smile
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group