⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controlsocket.py

📁 BitTorrent(简称BT
💻 PY
字号:
# The contents of this file are subject to the BitTorrent Open Source License# Version 1.0 (the License).  You may not copy or use this file, in either# source code or executable form, except in compliance with the License.  You# may obtain a copy of the License at http://www.bittorrent.com/license/.## Software distributed under the License is distributed on an AS IS basis,# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License# for the specific language governing rights and limitations under the# License.# Written my Uoti Urpalaimport osimport socketimport sysfrom binascii import b2a_hexfrom BitTorrent.RawServer import RawServerfrom BitTorrent import BTFailuredef toint(s):    return int(b2a_hex(s), 16)def tobinary(i):    return (chr(i >> 24) + chr((i >> 16) & 0xFF) +        chr((i >> 8) & 0xFF) + chr(i & 0xFF))class ControlsocketListener(object):    def __init__(self, callback):        self.callback = callback    def external_connection_made(self, connection):        connection.handler = MessageReceiver(self.callback)class MessageReceiver(object):    def __init__(self, callback):        self.callback = callback        self._buffer = []        self._buffer_len = 0        self._reader = self._read_messages()        self._next_len = self._reader.next()    def _read_messages(self):        while True:            yield 4            l = toint(self._message)            yield l            action = self._message            yield 4            l = toint(self._message)            yield l            data = self._message            self.callback(action, data)    # copied from Connecter.py    def data_came_in(self, conn, s):        while True:            i = self._next_len - self._buffer_len            if i > len(s):                self._buffer.append(s)                self._buffer_len += len(s)                return            m = s[:i]            if self._buffer_len > 0:                self._buffer.append(m)                m = ''.join(self._buffer)                self._buffer = []                self._buffer_len = 0            s = s[i:]            self._message = m            try:                self._next_len = self._reader.next()            except StopIteration:                self._reader = None                conn.close()                return    def connection_lost(self, conn):        self._reader = None        pass    def connection_flushed(self, conn):        passclass ControlSocket(object):    def __init__(self, config):        self.socket_filename = os.path.join(config['data_dir'], 'ui_socket')    def set_rawserver(self, rawserver):        self.rawserver = rawserver    def start_listening(self, callback):        self.rawserver.start_listening(self.controlsocket,                                  ControlsocketListener(callback))    def create_socket_inet(self):        try:            controlsocket = RawServer.create_serversocket(56881,                                                   '127.0.0.1', reuse=True)        except socket.error, e:            raise BTFailure("Could not create control socket: "+str(e))        self.controlsocket = controlsocket    def send_command_inet(self, rawserver, action, data = ''):        r = MessageReceiver(lambda action, data: None)        try:            conn = rawserver.start_connection(('127.0.0.1', 56881), r)        except socket.error, e:            raise BTFailure('Could not send command: ' + str(e))        conn.write(tobinary(len(action)))        conn.write(action)        conn.write(tobinary(len(data)))        conn.write(data)    #blocking version without rawserver    def send_command_inet(self, action, data=''):        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        try:            s.connect(('127.0.0.1', 56881))            s.send(tobinary(len(action)))            s.send(action)            s.send(tobinary(len(data)))            s.send(data)            s.close()        except socket.error, e:            s.close()            raise BTFailure('Could not send command: ' + str(e))    def create_socket_unix(self):        filename = self.socket_filename        if os.path.exists(filename):            try:                self.send_command_unix('no-op')            except BTFailure:                pass            else:                raise BTFailure("Could not create control socket: already in use")            try:                os.unlink(filename)            except OSError, e:                raise BTFailure("Could not remove old control socket filename:"                                + str(e))        try:            controlsocket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)            controlsocket.setblocking(0)            controlsocket.bind(filename)            controlsocket.listen(5)        except socket.error, e:            raise BTFailure("Could not create control socket: "+str(e))        self.controlsocket = controlsocket    def send_command_unix(self, rawserver, action, data = ''):        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)        filename = self.socket_filename        try:            s.connect(filename)        except socket.error, e:            raise BTFailure('Could not send command: ' + str(e))        r = MessageReceiver(lambda action, data: None)        conn = rawserver.wrap_socket(s, r, ip = s.getpeername())        conn.write(tobinary(len(action)))        conn.write(action)        conn.write(tobinary(len(data)))        conn.write(data)    # blocking version without rawserver    def send_command_unix(self, action, data=''):        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)        filename = self.socket_filename        try:            s.connect(filename)            s.send(tobinary(len(action)))            s.send(action)            s.send(tobinary(len(data)))            s.send(data)            s.close()        except socket.error, e:            s.close()            raise BTFailure('Could not send command: ' + str(e))    def close_socket(self):        self.rawserver.stop_listening(self.controlsocket)        self.controlsocket.close()    if sys.platform != 'win32':        send_command = send_command_unix        create_socket = create_socket_unix    else:        send_command = send_command_inet        create_socket = create_socket_inet

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -