2013-04-01 5 views
0

Почему этот код вернуть то, что мне нужно:Подключение к серверу через RCON

test2.py

import socket 

if __name__ == "__main__": 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.connect(("192.168.0.101", 28960)) 
    sock.send(b"\xFF\xFF\xFF\xFFrcon xxxxxxxxx status") 
    print (sock.recv(65565)) 
    sock.close() 

Желаемая Выход:

b'\xff\xff\xff\xffprint\nmap:mp_rust\nnum score ping guid name lastmsg address qport rate\n 

--- ----- ---- -------------------------------- --------------- ------- --------------------- ----- -----\n\n\x00' 

но этот код всегда возвращает:

b'\xff\xff\xff\xffdisconnect\x00' 

Мой код

test.py

import socket 
from models import RconConnection 

if __name__ == "__main__": 
    connection = RconConnection("192.168.0.101", 28960) 
    connection.connect() 
    connection.auth("xxxxxxxx") 
    connection.send("status") 
    print(connection.response(128)) 

models.py

import socket 

class RconConnection(object): 
    def __init__(self, ip, port): 
     self.ip = ip 
     self.port = port 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

    def connect(self): 
     self.socket.connect(("%s" % (self.ip), self.port)) 
     return 1 

    def auth(self, password): 
     string = "\xFF\xFF\xFF\xFFrcon_password %s" % (password) 
     self.socket.send(bytearray(string, "utf-8")) 
     return 1 

    def send(self, command): 
     string = "\xFF\xFF\xFF\xFFrcon %s" % (command) 
     self.socket.send(bytearray(string, "utf-8")) 
     return 1 

    def response(self, size): 
     string = self.socket.recv(size) 
     return string 

Test2.py и (test.py + models.py) не работают одновременно. Где разница между test2.py и его OO-реализацией в test.py и models.py?

ответ

1

Кажется, что оба сокета пытаются отправить данные после установления соединения.

... 
sock.connect(("192.168.0.101", 28960)) 
sock.send(b"\xFF\xFF\xFF\xFFrcon xxxxxxxxx status") # here 
... 

И

... 
connection.connect() 
connection.auth("xxxxxxxx") # here 
connection.send("status") # and here! 
... 

Сделать один/оба приема/передачи данных, когда другой делает противоположное, как я сделал для клиентского сокета ниже (так что никаких изменений не должны вносить звонки Rcon) ...

import socket 

if __name__ == "__main__": 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.connect(("192.168.0.101", 28960)) 
    auth = sock.recv() # recieve "xxxxxxxx" (auth) 
    status = sock.recv() # recieve "status" 
    sock.send(b"\xFF\xFF\xFF\xFFrcon xxxxxxxxx status") 
    sock.close() 
    print "Auth:", auth 
    print "Status:", status 
+0

Нет, я думаю, что вы не понимаете условия моего вопроса –

Смежные вопросы