Frage zu UDP Sockets
Übersicht

gambleBetreff: Frage zu UDP Sockets |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
ich versuche gerade, mit Sockets meinen Counter Strike:Source Server abzufragen. Hier mal der entsprechende Code: Code: [AUSKLAPPEN] Strict ' ************************************************** ' ************************************************** Function ipint:Int(umwandeln$) Local teil1:Int = Int(Instr(umwandeln$,".")) Local teil2:Int = Int(Instr(umwandeln$,".",teil1+1)) Local teil3:Int = Int(Instr(umwandeln$,".",teil2+1)) Local temp1:Int = Int(Mid(umwandeln$,1,teil1-1)) Local temp2:Int = Int(Mid(umwandeln$,teil1+1,teil2-1)) Local temp3:Int = Int(Mid(umwandeln$,teil2+1,teil3-1)) Local temp4:Int = Int(Mid(umwandeln$,teil3+1)) Local zurueck:Int = (temp1 Shl 24) + (temp2 Shl 16) + (temp3 Shl 8) + temp4 Return zurueck End Function ' ************************************************** ' ************************************************** Local UDP:TSocket Local Stream:TSocketStream Local Temp:String Local Char:Byte Local TempTime:Int Const timeout:Int = 1500 ' ************************************************** ' ************************************************** UDP = CreateUDPSocket() Stream = CreateSocketStream(UDP) BindSocket(UDP,27015) If Not UDP Then Notify("Error: Socket konnte nicht initialisiert werden.") If Not ConnectSocket(UDP,ipint("85.14.231.10"),27015) Then Notify("Error: Keine Verbindung zum Server.") ' ************************************************** ' ************************************************** WriteByte(Stream,$FF) WriteByte(Stream,$FF) WriteByte(Stream,$FF) WriteByte(Stream,$FF) WriteByte(Stream,$54) TempTime = MilliSecs() While MilliSecs()-TempTime < timeout If SocketReadAvail(UDP) > 0 Then Print "Antwort bekommen" End If Wend Print "Timeout" CloseStream(Stream) CloseSocket(UDP) Nach dem ich zuerst keine Antwort vom Server bekam, schaltete ich Ethereal an. Dieses zeigte mir nun an, dass BlitzMax jedes Byte, dass ich per WriteByte in den Stream geschrieben habe, einzeln verschickt. Ist also kein Wunder, dass der Server nichts versteht. Nur wie bekomme ich BlitzMax dazu, die Bytes nicht einzeln sondern zusammen zu verschicken? Danke. |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du könntest z.B. die Bytes in eine Bank schreiben, und dann die Bank versenden.
Aber wieso sollte der Server dich nicht 'verstehen', wenn jedes Byte ein einzelnenes Paket ist? |
||
![]() |
Byteemoz |
![]() Antworten mit Zitat ![]() |
---|---|---|
BORNtobeNAMELESS hat Folgendes geschrieben: Aber wieso sollte der Server dich nicht 'verstehen', wenn jedes Byte ein einzelnenes Paket ist?
Vermutlich weil UDP (im Gegensatz zu TCP) keine Verbindung aufbaut sondern man einzelne Datenpakete versendet. UDP stellt auch nicht sicher, dass die Pakete in der selben Reihenfolge ankommen, in der sie abgeschickt wurden. Daher kann der Server ein Paket nicht einfach aus den einzelen Byte-Paketen zusammensetzen... -- Byteemoz |
||
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achja, das hatte ich nicht bedacht.
Naja, dann bleibt dir nichts anderes übrig als die Daten in eine Bank zu schreiben, und diese zu versenden. |
||
![]() |
Byteemoz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oder du kannst einen String benutzen (der wird dann beim senden mit WriteString in ein Byte-Array umgewandelt):
Code: [AUSKLAPPEN] Local buf:String = Chr $FF + Chr $FF + Chr $FF + Chr $54
Stream.WriteString(buf) -- Byteemoz |
||
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Methode mit den Banks is daher einfacher, weil man auch die normalen Write-Befehle daruf anwenden kann:
Code: [AUSKLAPPEN] Local bank:TBank = CreateBank(0)
Local strm:TBankStream = CreateBankStream(bank) strm.WriteLine("Hallo!") strm.WriteInt(12345) strm.WriteShort(55) WriteBank(bank,deinUdpStream,0,bank.Size()) bank = Null strm.Close() strm = Null |
||
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm.. Wenn ich jetzt aus dem Stream lesen will, bekomme ich: "Error reading from stream"
Code: [AUSKLAPPEN] Strict ' ************************************************** ' ************************************************** Function ipint:Int(umwandeln$) Local teil1:Int = Int(Instr(umwandeln$,".")) Local teil2:Int = Int(Instr(umwandeln$,".",teil1+1)) Local teil3:Int = Int(Instr(umwandeln$,".",teil2+1)) Local temp1:Int = Int(Mid(umwandeln$,1,teil1-1)) Local temp2:Int = Int(Mid(umwandeln$,teil1+1,teil2-1)) Local temp3:Int = Int(Mid(umwandeln$,teil2+1,teil3-1)) Local temp4:Int = Int(Mid(umwandeln$,teil3+1)) Local zurueck:Int = (temp1 Shl 24) + (temp2 Shl 16) + (temp3 Shl 8) + temp4 Return zurueck End Function ' ************************************************** ' ************************************************** Local UDP:TSocket Local Stream:TSocketStream Local Temp:String Local Char:Byte Local TempTime:Int Const timeout:Int = 1500 ' ************************************************** ' ************************************************** UDP = CreateUDPSocket() Stream = CreateSocketStream(UDP) BindSocket(UDP,27015) If Not UDP Then Notify("Error: Socket konnte nicht initialisiert werden.") If Not ConnectSocket(UDP,ipint("85.14.231.10"),27015) Then Notify("Error: Keine Verbindung zum Server.") ' ************************************************** ' ************************************************** Local bank:TBank = CreateBank(0) Local strm:TBankStream = CreateBankStream(bank) strm.WriteByte($FF) strm.WriteByte($FF) strm.WriteByte($FF) strm.WriteByte($FF) strm.WriteByte($54) strm.WriteByte($53) strm.WriteByte($6F) strm.WriteByte($75) strm.WriteByte($72) strm.WriteByte($63) strm.WriteByte($65) strm.WriteByte($20) strm.WriteByte($45) strm.WriteByte($6E) strm.WriteByte($67) strm.WriteByte($69) strm.WriteByte($6E) strm.WriteByte($65) strm.WriteByte($20) strm.WriteByte($51) strm.WriteByte($75) strm.WriteByte($65) strm.WriteByte($72) strm.WriteByte($79) strm.WriteByte($00) WriteBank(bank,Stream,0,bank.Size()) bank = Null strm.Close() strm = Null TempTime = MilliSecs() While MilliSecs()-TempTime < timeout If UDP.ReadAvail() > 0 Then Print Chr(ReadByte(Stream)) End If Wend Print "Timeout" CloseStream(Stream) CloseSocket(UDP) |
||
![]() |
Byteemoz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit "recvfrom_" scheint es zu funktionieren:
http://blitzmax.com/Community/...822#678788 -- Byteemoz Code: [AUSKLAPPEN] ... While MilliSecs()-TempTime < timeout If UDP.ReadAvail() > 0 Then Print (UDPReadByte(UDP)) End If Wend Print "Timeout" CloseStream(Stream) CloseSocket(UDP) Function UDPReadByte:Int(Socket:TSocket) Local buf:Byte Local sender_ip:Int, sender_port:Int recvfrom_ .. Socket._socket, Varptr buf, 1, .. ' sockethandle, buffer, buffersize 0, .. ' flags sender_ip, sender_port Return buf EndFunction ![]() |
||
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread |
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Immerhin ein Schritt weiter. Wenn ich jetzt aber noch eine zweite UDPReadByte(UDP) Anweisung in die Schleife schreibe, scheint das Programm zu hängen. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group