swat4 server status script: udp problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
madmaurice
User
Beiträge: 5
Registriert: Sonntag 30. März 2008, 12:42

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..
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Verwende mal in der Forumssuche die Stichworte "nonblocking socket".
MfG
HWK
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

BTW, das Verb heißt "to receive".
madmaurice
User
Beiträge: 5
Registriert: Sonntag 30. März 2008, 12:42

werd ich machen HWk

sry Y0Gi
madmaurice
User
Beiträge: 5
Registriert: Sonntag 30. März 2008, 12:42

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
madmaurice
User
Beiträge: 5
Registriert: Sonntag 30. März 2008, 12:42

er hängt sich jezt nicht mehr auf aber verbinden geht jezt irwie auch nicht mehr. mitm php script gehts mit python nich
madmaurice
User
Beiträge: 5
Registriert: Sonntag 30. März 2008, 12:42

sry guys hab nicht gewusst das der gameport und der queryport verschieden sind xD

habs durch zufall herausgefunden

danke jezt hab ich die daten
Tompee
User
Beiträge: 18
Registriert: Sonntag 7. Oktober 2007, 17:13

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
BlackJack

Woher weisst Du, dass keine Daten zurück kommen? Du hast da eine Endlosschleife, das ``print data`` wird nie erreicht.
Tompee
User
Beiträge: 18
Registriert: Sonntag 7. Oktober 2007, 17:13

:oops: Stimmt ja, wie peinlich, nun funktioniert es.

Dankeschön
Antworten