Netzwerk(TCP) und das leidige Thema: Eof(Stream) = -1
Übersicht

![]() |
Xaymarehemals "Cgamer"Betreff: Netzwerk(TCP) und das leidige Thema: Eof(Stream) = -1 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich muss leider mal wieder mit tcp hantieren. probiere derzeit 1nen tcp stream für mehr als 1200msec aufrecht zu erhalten. leider closed blitz den stream immer automatisch:( weiß jemand wie ich das ändern/beheben kann? im source taucht nicht einmal Closetcpstream auf, auf beiden seiten.. | ||
Warbseite |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi cgamer
kann es sein das du AcceptTcpStream nicht ausführst ? Wenn ja , kein wunder , denn dann ist kein TCP Stream zustande gekommen. Zwischen was willste denn ne Verbindung ? Blitz <-> Blitz Blitz <-> Website Viele Grüße TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Pummelie |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn du eine verbindung zwischen blitz <> blitz erhalten möchtest, sende doc h irgendwelchen müll, der vom jeweils anderen programm ignoriert wird.
z.b alle 500 millisekunden eine 1 senden |
||
It's done when it's done. |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
das ist ein UDP verfahren .
Bei TCP handelt es sich um Streams, hier muss mit AcceptTcpStream angenommen werden. Bei UDP gibt es meines wissens nur so ein 0815 Stream aber keinen Richtigen Stream ^^ Bei UDP kann man auch an den hintern der Welt senden und es juckt keinen, aber bei TCP würde allein schon CreateTCPStream nicht gehen. Viele Grüße TimBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
das server programm ist so in etwa aufgebaut:
Code: [AUSKLAPPEN] AppTitle "testserver - 0/32, sa_default"
Global ServerVersion = 255 Global RespTimer = CreateTimer(5) ;Start Config Global ServerName$ = "Unnamed Server" Global ServerPort = 27105 Global ServerPass = "" Global AdminPass = "jX7cdbuH" Global MaxPlayers = 32 Global MaxMSGLength= 256 Global MaxPlrChans = 2 Global MoTD$ = "Welcome to Space Apocalypse Server" Global Banlist$ = "" Global Map$ = "sa_default" ;C++ Note: Load the config out of a file. ;End config Global CurPlayers = 0 Global NewPlayerID = MaxPlayers*Rnd(.25, 5) server = CreateTCPServer(ServerPort) Dim NewChatMSG$(MaxPlayers*2) If server <> 0 AddChannel("Test-1") AddChannel("Test-2") timer = CreateTimer(15) Print "Server ready" While Not KeyHit(1) stream = AcceptTCPStream(server) If stream <> 0 If CurPlayers < MaxPlayers P.Players = New Players P\ID = NewPlayerID P\Stream = Stream CurPlayers = CurPlayers + 1 AppTitle ServerName$ + " - "+CurPlayers+"/"+MaxPlayers+", "+Map Else CloseTCPStream stream EndIf EndIf For P.Players = Each Players DebugLog P\ID+" "+P\State While Eof(P\Stream) = 0 TType = ReadByte(P\Stream) Select TType Case 1 ;connect->login P\Name$ = ReadStringNew(P\Stream) P\Client$ = ReadStringNew(P\Stream) P\State = 0 WriteByte P\Stream, ServerVersion AnnounceNewPlayer(P\ID, P\Name$) Print "Player logged in("+P\Name$+", "+P\Client$+")" Case 2 ;ready for data If P\State = 0 P\State = 1 For O.Objects = Each Objects WriteByte P\Stream, O\Typ Select O\Typ Case 1;entity WriteByte P\Stream, O\ETyp WriteFloatNew P\Stream, O\X# WriteFloatNew P\Stream, O\Y# WriteFloatNew P\Stream, O\Z# WriteFloatNew P\Stream, O\RX# WriteFloatNew P\Stream, O\RY# WriteFloatNew P\Stream, O\RZ# WriteFloatNew P\Stream, O\W# WriteFloatNew P\Stream, O\H# WriteFloatNew P\Stream, O\D# WriteByte P\Stream, O\R WriteByte P\Stream, O\G WriteByte P\Stream, O\B WriteByte P\Stream, O\A ;0 - invisible, 255 - visible WriteByte P\Stream, O\Collide ;1 - yes, 0 - you know what this is then(no?) Case 2;model WriteStringNew P\Stream, O\File$ Case 3;sound WriteStringNew P\Stream, O\File$ End Select Next For P2.Players = Each Players WriteByte P\Stream, 4 WriteInt32New P\Stream, P2\ID WriteStringNew P\Stream, P2\Name Next ElseIf P\State = 1 P\State = 2 EndIf Case 3 ;Player Update P\X# = ReadFloatNew(P\Stream) P\Y# = ReadFloatNew(P\Stream) P\Z# = ReadFloatNew(P\Stream) P\RX# = ReadFloatNew(P\Stream) P\RY# = ReadFloatNew(P\Stream) P\RZ# = ReadFloatNew(P\Stream) P\Speed# = ReadFloatNew(P\Stream) Case 4 ;Chat Message MSG$ = ReadStringNew(P\Stream) If UpdateChatCommands(MSG$) = 0 SendChatMSG(P.Players, MSG$) EndIf Print P\Name$ + ": "+MSG$ End Select Wend;Iwas "disconnected" den client vom server UpdatePlayers(P\Stream, Handle(P.Players)) If Eof(P\Stream) = -1 Print "Player("+P\Name$+" disconnected" CloseTCPStream P\Stream Delete P.Players CurPlayers = CurPlayers -1 EndIf Next Flip 0 WaitTimer timer Wend CloseTCPServer server EndIf ;Types Type Players ;Standard Field ID, Name$, Client$, HP, Shield ;Position, Rotation, Speed Field X#, Y#, Z# Field RX#, RY#, RZ# Field Speed# ;Chat Field State ;0 - Joining, 1 - Waiting for Data, 2 - Playing, 3 - Admin, 4 - Muted by Admin Field Ping Field Channel, OwnedChannels ;Network Field Stream End Type Type Channels Field Name$ Field Owner$ Field MoTD$ End Type Type Objects Field Typ Field X#, Y#, Z# Field RX#, RY#, RZ# Field W#, H#, D# Field R, G, B, A Field Collide ;Entity(0) Field ETyp ;Model(1), Sound(2) Field File$ End Type ;Functions Function UpdatePlayers(Stream, PHExclude) For P.Players = Each Players If Handle(P.Players) <> PHExclude WriteByte Stream, 0 WriteFloatNew Stream, P\X WriteFloatNew Stream, P\Y WriteFloatNew Stream, P\Z WriteFloatNew Stream, P\RX WriteFloatNew Stream, P\RY WriteFloatNew Stream, P\RZ WriteFloatNew Stream, P\Speed WriteShortNew Stream, P\Ping EndIf Next End Function Function SendChatMSG(Sender.Players, MSG$) For P.Players = Each Players If P\State = 2 WriteByte P\Stream, 1 WriteStringNew P\Stream, "["+Sender\Name$+"]"+MSG$ ElseIf P\State = 3 WriteByte P\Stream, 1 WriteStringNew P\Stream, "["+Sender\Name$+"@"+Sender\Client$+"]"+MSG$ EndIf Next End Function Function AnnounceNewPlayer(ID, Name$) For P.Players = Each Players If P\State = 2 Or P\State = 3 WriteByte P\Stream, 1 WriteInt32New P\Stream, ID WriteStringNew P\Stream, Name$ EndIf Next End Function Function AddChannel(Name$, Owner$=-1) C.Channels = New Channels C\Name = Name C\Owner = Owner Return 1 End Function Function UpdateChatCommands(ChatMSG$) For C.Commands = Each Commands If C\Name$ = Lower(Mid(ChatMSG$, 1, Instr(ChatMSG$, " "))) C\Args$ = Mid(ChatMSG$, Instr(ChatMSG$, " ")+1, -1) ReturnVal = 1 Else C\Args$ = "" EndIf Next Return ReturnVal End Function ;For Plugins Function AddChatCommand(Name$) ;C++ Note: C++ kann hier auch Name$ und dann @Funktion()(Funktionspointer) haben oder? C.Commands = New Commands C\Name = Lower(Name) End Function Function CheckChatCommand(Name$) For C.Commands = Each Commands If C\Name$ = Lower(Name$) C\Args = 0 Return C\Args EndIf Next Return 0 End Function ;Chat Commands Type Commands Field Name$ Field Args$ End Type ;Network Function WriteStringNew(Stream, Strng$) If Stream <> 0 Ln = Len(Strng$) For Pos = 1 To Ln WriteByte Stream, Asc(Mid(Strng$, Pos, 1)) Next WriteByte Stream, 0 Return 1 EndIf Return 0 End Function Function WriteFloatNew(Stream, F#) ;Min=0, Max=4294967296 If Stream <> 0 ;BB: Min=-2147483647, Max=2147483648 (Not Sure) Byte1 = F# And $FF Byte2 = ((F# And $FF00) Shl 8) Byte3 = ((F# And $FF0000) Shl 16) Byte4 = ((F# And $FF000000) Shl 24) WriteByte Stream, Byte1 WriteByte Stream, Byte2 WriteByte Stream, Byte3 WriteByte Stream, Byte4 Return 1 EndIf Return 0 End Function Function WriteInt32New(Stream, Int32) ;Min=0, Max=4294967296 If Stream <> 0 ;BB: Min=-2147483647, Max=2147483648 (Not Sure) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Byte4 = ((Int32 And $FF000000) Shl 24) WriteByte Stream, Byte1 WriteByte Stream, Byte2 WriteByte Stream, Byte3 WriteByte Stream, Byte4 Return 1 EndIf Return 0 End Function Function WriteInt24New(Stream, Int24) ;Min=0, Max=16777216 If Stream <> 0 ;BB: Min=-8388607, Max=8388608 (Not Sure) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) WriteByte Stream, Byte1 WriteByte Stream, Byte2 WriteByte Stream, Byte3 Return 1 EndIf Return 0 End Function Function WriteShortNew(Stream, Short) ;Min=0, Max=65535 If Stream <> 0 ;BB: Min=-32767, Max=32768 (Not Sure) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) WriteByte Stream, Byte1 WriteByte Stream, Byte2 Return 1 EndIf Return 0 End Function Function ReadStringNew$(Stream) If WaitOnData(Stream, 2500) = 1 While Not Eof(Stream) Byte = ReadByte(Stream) If Byte > 0 Out$ = Out$ + Chr(Byte) Else Return Out$ EndIf Wend EndIf Return "" End Function Function ReadFloatNew#(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Byte3 = ReadByte(Stream) Byte4 = ReadByte(Stream) F# = (Byte4 Shr 24) Or (Byte3 Shr 16) Or (Byte2 Or 8) Or Byte1 Return F# EndIf Return 0 End Function Function ReadInt32New(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Byte3 = ReadByte(Stream) Byte4 = ReadByte(Stream) Integ = (Byte4 Shr 24) Or (Byte3 Shr 16) Or (Byte2 Or 8) Or Byte1 Return Integ EndIf Return 0 End Function Function ReadInt24New(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Byte3 = ReadByte(Stream) Integ = (Byte3 Shr 16) Or (Byte2 Shr 8) Or Byte1 Return Integ EndIf Return 0 End Function Function ReadShortNew(Stream) If WaitOnData(Stream, 2500) = 1 Byte1 = ReadByte(Stream) Byte2 = ReadByte(Stream) Short = (Byte2 Shr 8) Or Byte1 Return Short EndIf Return 0 End Function Function WaitOnData(Stream, TimeOut=10000) MSec = MilliSecs() While Eof(Stream) If MilliSecs()-MSec > TimeOut Return 0 EndIf WaitTimer RespTimer Wend Return 1 End Function Function WriteData(Stream, Dat$) For A = 1 To Len(Dat$) WriteByte Stream, Asc(Mid(Dat$, A, 1)) Next Return 1 End Function Function AddNullString$(Dat$, Txt$) Dat$ = Dat$ + Txt$ + Chr(0) Return Dat$ End Function Function AddString$(Dat$, Txt$) Dat$ = Dat$ + Txt$ Return Dat$ End Function Function AddInt32$(Dat$, I) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Byte4 = ((Int32 And $FF000000) Shl 24) Dat$ = Dat$ + Chr(Byte1) + Chr(Byte2) + Chr(Byte3) + Chr(Byte4) Return Dat$ End Function Function AddInt24$(Dat$, I) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Byte3 = ((Int32 And $FF0000) Shl 16) Dat$ = Dat$ + Chr(Byte1) + Chr(Byte2) + Chr(Byte3) Return Dat$ End Function Function AddShort$(Dat$, S) Byte1 = Int32 And $FF Byte2 = ((Int32 And $FF00) Shl 8) Dat$ = Dat$ + Chr(Byte1) + Chr(Byte2) Return Dat$ End Function Function AddByte$(Dat$, B) Dat$ = Dat$ + Chr(B) Return Dat$ End Function der part des clientes so: Code: [AUSKLAPPEN] Function Game()
If ConnectState = 0 ;Connect If Lower(ConnectIP) = "localhost" ConnectIP = "127.0.0.1" If ConnectPort = 0 ConnectPort = 4001 DrawImage Main_Loadingscreen, GrW/2, GrH/2 Text GRW/2, GrH/2+128, "Connecting to "+ConnectIP+":"+ConnectPort+"...",1 ,1 Flip If ConnectIP$ <> "" ConnectStream = OpenTCPStream(ConnectIP$, ConnectPort) If ConnectStream <> 0 DrawImage Main_Loadingscreen, GrW/2, GrH/2 Text GrW/2, GrH/2+113, "Connecting to "+ConnectIP+":"+ConnectPort+"...", 1, 1 Text GrW/2, GrH/2+128, "Connected. Logging in...", 1, 1 Flip WriteByte(ConnectStream, 1) WriteStringNew(ConnectStream, Name$) WriteStringNew(ConnectStream, "Space Apocalypse V"+SAVersion) If WaitOnData(ConnectStream) = 1 TVersion = ReadByte(ConnectStream) ServerVersion = Replace(RSet(TVersion, 3), " ", "0") ServerVersion = Left(ServerVersion,1)+"."+Right(ServerVersion,2) DrawImage Main_Loadingscreen, GrW/2, GrH/2 Text GrW/2, GrH/2+98, "Connecting...",1 , 1 Text GrW/2, GrH/2+113, "Connected. Logging in...", 1, 1 Text GrW/2, GrH/2+128, "Logged In. Server Version: "+ServerVersion, 1, 1 Flip ConnectState = 1 Else GameState = 1 CloseTCPStream(ConnectStream) Notify$ = "Server didnt answer" EndIf Else GameState = 1 Notify$ = "Cant connect to Server" EndIf Else GameState = 1 Notify$ = "IP cant be Null" EndIf ElseIf ConnectState = 1 ;Load DrawImage Main_Loadingscreen, GrW/2, GrH/2 Text GrW/2, GrH/2+83, "Connecting...",1 , 1 Text GrW/2, GrH/2+98, "Connected. Logging in...", 1, 1 Text GrW/2, GrH/2+113, "Logged In. Server Version: "+ServerVersion, 1, 1 Text GrW/2, GrH/2+128, "Loading...", 1, 1 Flip WriteByte ConnectStream, 2 ; WaitOnData(ConnectStream) While Eof(ConnectStream) = 0 TType = ReadByte(ConnectStream) DebugLog TType Select TType Case 1 ;Object ETyp = ReadByte(ConnectStream) O.Objects = New Objects Select ETyp Case 0 ;Cube O\Mesh = CreateCube() Case 1 ;Sphere O\Mesh = CreateSphere() Case 2 ;Cone O\Mesh = CreateCone() Case 3 ;Cylinder O\Mesh = CreateCylinder() End Select ;Position, Scale PositionEntity O\Mesh, ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream) RotateEntity O\Mesh, ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream) ScaleEntity O\Mesh, ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream) ;Color EntityColor O\Mesh, ReadByte(ConnectStream), ReadByte(ConnectStream), ReadByte(ConnectStream) EntityAlpha O\Mesh, ReadByte(ConnectStream)/255. Case 2 ;Model File$ = ReadStringNew(ConnectStream) Case 3 ;Sound File$ = ReadStringNew(ConnectStream) Case 4 ;Player P2.Players = New Players P2\ID = ReadInt32New(ConnectStream) P2\Name$ = ReadStringNew(ConnectStream) P2\Mesh = CreateCube() End Select Wend WriteByte ConnectStream, 2 ElseIf ConnectState = 2 ;Game Repeat While Not Eof(ConnectStream) TType = ReadByte(ConnectStream) Select TType Case 0 ;Update Player Positions PID = ReadInt32New(ConnectStream) For P.Players = Each Players If P\ID = PID PositionEntity P\Mesh, ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream) RotateEntity P\Mesh, ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream), ReadFloatNew(ConnectStream) P\Speed = ReadFloatNew(ConnectStream) P\Ping = ReadShortNew(ConnectStream) EndIf Next Case 1 ;New Player Announce P.Players = New Players P2\ID = ReadInt32New(ConnectStream) P2\Name$ = ReadStringNew(ConnectStream) P2\Mesh = CreateCube() Case 2 ;Chat MSG DebugLog ReadStringNew(ConnectStream) Case 3 ;Kicked, Banned Notify$ = "Kicked: "+ReadStringNew(ConnectStream) ConnectState = 3 End Select Wend RenderWorld UpdateWorld If Menu_is_open = 0 If KeyHit(1) Menu_is_open = 1 Else TileImage Main_Darken SetFont NormalFont DrawImage Menu_Requester, GrW/2, GrH/2 Color 0, 0, 0:Text GrW/2, GrH/2-28, "Warning", 1, 1 Text GrW/2, GrH/2, "Really leave the Server?", 1, 1 If MIR(GrW/2-98, GrH/2+16, 75, 20) = 1 And MousH(1) = 1 Or KeyHit(28) ConnectState = 3 EndIf If MIR(GrW/2+23, GrH/2+16, 75, 20) = 1 And MousH(1) = 1 Or KeyHit(1) Menu_is_open = 0 EndIf EndIf Forever ElseIf ConnectState = 3 ;Unload For Oo.Objects = Each Objects:FreeEntity Oo\Mesh:Next For Op.Players = Each Players:FreeEntity Op\Mesh:Next Delete Each Objects Delete Each Players CloseTCPStream ConnectStream ConnectState = 0 EndIf End Function aber es ist eigentlich egal was ich mache, nach ca 1er sekunde ist der stream tot(obwohl tcptimeouts 10000, 10000 gesetzt ist) |
||
Warbseite |
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] stream = AcceptTCPStream(server)
If stream <> 0 If CurPlayers < MaxPlayers P.Players = New Players P\ID = NewPlayerID P\Stream = Stream CurPlayers = CurPlayers + 1 AppTitle ServerName$ + " - "+CurPlayers+"/"+MaxPlayers+", "+Map ;Else ;CloseTCPStream stream EndIf EndIf versuch es mal so , z. 40 in der gegend war das. Viele Grüße TiMBo |
||
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31 hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht. |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
verbinden geht ja. aber der server hat genau an dem punkt wo disconnected wird(nicht durch client oder server), ein lagg(weißes fenster):
habe grade dasselbe mit 2 anderen temp-tests probiert, passiert genau dasselbe |
||
Warbseite |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group