python - 从 python 中的 Twisted 协议(protocol)获取裸套接字 fd?

标签 python sockets twisted

我想做的是将 Twisted 与 python 标准库中的 Cmd 模块结合起来。

简而言之,我希望能够从连接的协议(protocol)中获取基本的套接字 fd 对象,以用作标准库中 cmd.Cmd 模块的标准输入。

总而言之,与我的服务器交互的我的客户端使用 Cmd 模块来处理命令并将这些命令发送到服务器。

在我的服务器上,我也想使用与构建 Cmd 模块相同的命令处理方法。为此,我需要指定命令解释器的标准输入和标准输出。 我可以使用内置套接字模块轻松地做到这一点,但如果可能的话,我想用扭曲的方式来做到这一点。

这里有一些代码可以用普通套接字做我想做的事情:

(使用远程登录)

# 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 127.0.0.1 2319

然后你发送'sayhi' 没有任何反应。但是,如果您在终端上键入“sayhi”,您从(有一个(Cmd)提示符)启动服务器,输出将转到 telnet 客户端。所以 cmd.Cmd 的标准输出正在工作。但不是标准输入。这可能与 telnet 默认发送 CR-LF ('\r\n') 这一事实有关。 cmd 模块可能只监听\n。

那么如何从扭曲的协议(protocol)中获取 fd 或文件对象来完成我在这里尝试使用裸套接字实现的目标?

关于连接到服务器的 telnet 输入没有向 CmdProcessor 注册的任何见解?

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

最佳答案

我建议您改为查看 Manhole .

一般来说,Twisted 的重点是直接使用Python 套接字对象。这是 Twisted 工作的重要组成部分。当您想使用 Twisted 与网络交互时,您可以使用 Twisted 的 API - 协议(protocol)和传输,如果您正在考虑最低级别的话。

关于python - 从 python 中的 Twisted 协议(protocol)获取裸套接字 fd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24392149/

相关文章:

python-3.x - Python套接字: how to detect and list connected clients in server in the other clients and how to update it when a client disconnected?

python - 让 selenium 在 pythonanywhere 上工作

python - 如何跨多个进程登录 WSGI 应用程序?

Python Win32GUI 查找窗口

java - 什么是多路复用套接字通信?

mysql - 找不到 mysqld.sock : Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

python - 在 Twisted 中实现 Direct Connect 客户端的正确方法?

python - 如何创建一个带有两个线程的 python 应用程序,每个线程都有一个高速公路应用程序

python - 无法安装flask-mysqldb

python - 何时使用 Tornado,何时使用 Twisted/Cyclone/GEvent/other