TCP-Probleme
Übersicht

Donald AguBetreff: TCP-Probleme |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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). ![]() Außer dem wird der Befehl sogar im Onlihehilfe-Beispiel verwendet, um eine achricht auszulesen, sehr komisch ![]() 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 ![]() Vielen Dank AGU |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Nachdem Server mit Client verbunden ist, werden dann beide Seiten gleich behandelt?
Ja, zumindest, wenn sie erstmal verbunden sind ![]() 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 ![]() Also mit WriteByte, ReadByte etc. |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Donald Agu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 "Verbunden oder mit <esc> abgebrochen!" ; klingt verwirrend, meint aber nur, dass die Rechner verbunden sind, sofern nicht <esc> gedrückt wurde 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 "Verbunden oder mit <esc> abgebrochen!" 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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? ![]() Ich probiers auf jeden Fall mal aus und bedanke mich fürs erste ![]() ~EDIT~ Hat leider net geklappt, schade ![]() 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 ![]() Ich bin mir aber nicht sicher und kann es auch nicht nachprüfen. Weiß jemand von euch vielleicht Rat? ![]() THX AGU |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
warum sollten die streams gleich sein ![]() 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 ![]() Ich hoffe du verstehst ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Donald Agu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nene, du hast da scheinbar was übersehen ![]() ![]() 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... ![]() 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 "Verbunden!" 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 "Verbunden!" 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) ![]() Wenn du lust hast, kannst du ja den fehler noch suchen, ist vielleicht auch ganz interessant, die sache ![]() Ich bedank mich jedenfalls schonmal herzlich für deine Hilfe AGU ![]() |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
nana...bisschen hast ja geschummelt ^^
im oben von dir hingeschriebenen Code hast du aber nichts vor ReadByte geschrieben....du SCHUMMLER ![]() PS: ich hoffe ich krieg noch einen Kuchen ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Donald Agu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Stimmt. Da hatte ich nix von Readavail geschrieben, das habb ich aber auch nie behauptet. ![]() 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 ![]() Hoffentlich hast du kein Patent auf den befehl, sonst muss ich das wohl irgendwie umgehen...HILFE!! ![]() Was hältst du von nem Guglhupf? Mit Schoki oder ohne? ![]() |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klingt gut, hab noch nie einen Guglhupf gegessen ![]() 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 ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group