从python中的Twisted协议获取裸套接字fd?

时间:2014-06-24 16:49:11

标签: python sockets twisted

我想要做的是将Twisted与python的stdlib中的Cmd模块结合起来。

简而言之,我希望能够从连接的协议中获取bare-bones套接字fd对象,以用作stdlib中cmd.Cmd模块的stdin。

在Long中,与我的服务器接口的客户端使用Cmd模块处理命令并将这些命令发送到服务器。

在我的服务器上,我还想使用与构建Cmd模块相同的命令处理方法。为此,我需要指定命令解释器的stdin和stdout。 我可以使用内置套接字模块轻松完成这项工作,但如果可能,我想用扭曲的方式来做。

这是一些用普通套接字做我想要的代码:

(与telnet合作)

# server
import socket
import cmd

class CmdProcessor(cmd.Cmd, object):
    def __init__(self, sock, addr):
        network = sock.makefile()
        super(CmdProcessor, self).__init__(stdin=network, stdout=network)
        self.sock = sock
        self.addr = addr

        # Run the cmd.Cmd processing loop
        self.cmdloop()

    def do_sayhi(self, args):
        # When 'sayhi' is recieved over the socket,
        self.sock.send("Hey yourself!")

    def do_quit(self, args):
        self.sock.close()


if __name__ == "__main__":
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_sock.bind(("0.0.0.0", 2319))
    server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_sock.listen(5)

    sock, addr = server_sock.accept()
    print("Connection accepted")
    connection = CmdProcessor(sock, addr)

几乎我想做什么。我只是快速打字,所以我可能会错过任何东西。一半有效。目前,如果你telnet到服务器,如:

telnet 127.0.0.1 2319

你发送' sayhi'什么都没发生。但是,如果你输入' sayhi'在终端你启动服务器(有一个(Cmd)提示)输出到telnet客户端。所以cmd.Cmd的标准输出正在工作。但不是斯坦丁。这可能与telnet默认发送CR-LF(' \ r \ n')这一事实有关。 cmd模块可能只听取\ n。

那么怎样才能从协议中获取fd或file对象来做我正在尝试用裸插座实现的目标?

有关telnet连接到服务器的输入是不是在CmdProcessor中注册的任何见解?

欢迎任何建议,提示或指示。 (等等不,没有指针。) 感谢。

2 个答案:

答案 0 :(得分:1)

我建议您可以查看Manhole

通常,Twisted的重点是直接使用Python套接字对象。这是Twisted工作的重要组成部分。当您想使用Twisted与网络进行交互时,如果您考虑的是最低级别,则使用Twisted的API - 协议和传输。

答案 1 :(得分:0)

您可以添加use_rawinput = False

class CmdProcessor(cmd.Cmd, object):
    use_rawinput = False
    def __init__(self, sock, addr):
    ....

这会从telnet产生对sayhi的响应