Seite 1 von 1

swat4 server status script: udp problem

Verfasst: Sonntag 30. März 2008, 12:49
von madmaurice
ich hab mir aus langeweile mal ein swat4 server status script als projekt ausgedacht und hab mir eine php version davon runtergeladen. laut dem php-script muss ich
erst 2 zeichen per udp hinsenden:
chr(0x5c) und chr(0x62)

was etwa \b ergibt.

nun hab ich soweit schon das folgende py skript:

Code: Alles auswählen

# SWAT4 Server status script

from socket import *
import time

host = "89.239.3.11"
port = 10420
buf = 1024
addr = (host,port)

udp = socket(AF_INET,SOCK_DGRAM)

packet = chr(0x5c) + chr(0x62)

print "Send data..."

print packet;

udp.sendto(packet, addr)

starttime = time.clock()

data = ""
while 1:
    print "Recieving..."
    try:
        d, addr = udp.recvfrom(buf)
    except:
        print "-- Socket hang up"
        break
        
    if not d:
        print "-- No data"
        break
    if starttime+5 < time.clock():
        print "-- Time out"
        break
    data = data + d;
    if data.find("\\final\\\\") > -1: #<-- ende der status daten
        print "-- Data read"
        break

print "Recieved Data:\n"

print data
jezt bleibt python aber nach dem 3 mal print "Recieving..." hängen...

kann ich da irwie was tun?

try- except geht nicht.

timeout mit time.clock() geht nicht

auch das überprüfen ob d was enthält geht nicht..

Verfasst: Sonntag 30. März 2008, 13:19
von HWK
Verwende mal in der Forumssuche die Stichworte "nonblocking socket".
MfG
HWK

Verfasst: Sonntag 30. März 2008, 13:21
von Y0Gi
BTW, das Verb heißt "to receive".

Verfasst: Sonntag 30. März 2008, 13:27
von madmaurice
werd ich machen HWk

sry Y0Gi

Verfasst: Sonntag 30. März 2008, 13:32
von madmaurice
ich hab mal udp.setblocking(0) davor gesetz und promp n fehler bekommen

Code: Alles auswählen

The socket operation could not complete without blocking

Verfasst: Sonntag 30. März 2008, 14:21
von HWK
So ist es auch hier nach gettimeout() beschrieben: http://docs.python.org/lib/socket-objects.html
Wie wäre es dann mit settimeout() oder select.select()?
MfG
HWK

Verfasst: Sonntag 30. März 2008, 16:10
von madmaurice
er hängt sich jezt nicht mehr auf aber verbinden geht jezt irwie auch nicht mehr. mitm php script gehts mit python nich

Verfasst: Sonntag 30. März 2008, 19:14
von madmaurice
sry guys hab nicht gewusst das der gameport und der queryport verschieden sind xD

habs durch zufall herausgefunden

danke jezt hab ich die daten

Verfasst: Freitag 8. August 2008, 05:50
von Tompee
Hi,

ich habe gerade das gleiche Problem mit Battlefield2.
Ich bekomme einfach keine Daten zurück.
Der Port stimmt bei mir.

Code: Alles auswählen

#!/usr/bin/env python

from socket import *

host = '85.214.101.48'
port = 29900
buf = 4096
addr = (host, port)

udp = socket(AF_INET, SOCK_DGRAM)
packet = chr(0xFE) + chr(0xFD) + chr(0x00) + chr(0x10) + chr(0x20) + chr(0x30) + chr(0x40) + chr(0xFF) + chr(0xFF) + chr(0xFF) + chr(0x01) 

udp.sendto(packet, addr)
udp.settimeout(3)

data = ""

while 1:
	d = udp.recv(buf)
	data = data + d

print data 
Hier mal ein Beispiel mit PHP, welches funktioniert.
http://pastebin.com/m6d84a954

Gruss Tompee

Verfasst: Freitag 8. August 2008, 06:42
von BlackJack
Woher weisst Du, dass keine Daten zurück kommen? Du hast da eine Endlosschleife, das ``print data`` wird nie erreicht.

Verfasst: Freitag 8. August 2008, 06:48
von Tompee
:oops: Stimmt ja, wie peinlich, nun funktioniert es.

Dankeschön