Frage zu UDP Sockets

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

gamble

Betreff: Frage zu UDP Sockets

BeitragDi, Jul 18, 2006 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 18, 2006 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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


Arrow Und hier ist die Antwort nochmal in Englisch: http://blitzmax.com/Community/...507#687430
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread
 

gamble

BeitragDi, Jul 18, 2006 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Immerhin ein Schritt weiter. Wenn ich jetzt aber noch eine zweite UDPReadByte(UDP) Anweisung in die Schleife schreibe, scheint das Programm zu hängen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group