【问题标题】:Changing transport's recv and send methods更改传输的接收和发送方法
【发布时间】:2021-02-10 17:24:09
【问题描述】:

我正在尝试使用pysctp 套接字实现基于 SCTP 和 asyncio 的客户端。理想情况下,我想做这样的事情:

async def sctp_client():
    sock = sctp.sctpsocket_udp(socket.AF_INET)
    reader, writer = await asyncio.open_connection(sock=sock)
    writer.write(b'some data', ppid=5)
    await writer.drain()
    data = await reader.read(100)
    print(f'Received: {data.decode()}')
    writer.close()
    await writer.wait_closed()

在实践中,有两个问题:

  • 有没有办法将“运输工厂”传递给open_connectionloop.create_connection 我希望流包含的传输对象使用sctp_recv 而不是recvsctp_send 而不是send。显然,最简单的方法是从原始传输类派生,但我找不到一个好的 Python 方法。
  • 有没有办法从 open_connection 获得自定义 StreamWriter 显然我可以从原始文件中创建自己的,向原始文件添加方法或仅访问内部传输,但这些选项是非常丑陋。我能想到的第二个最佳方法就是使用loop.create_connection 实现我自己的open_connection

非常感谢!

【问题讨论】:

    标签: python python-asyncio sctp


    【解决方案1】:

    source code,没有办法给asyncio.open_connection提供工厂。也就是说,那里的代码并不是非常复杂。注意文档字符串的最后一行:

    (如果您想自定义 StreamReader 和/或 StreamReaderProtocol 类,只需复制代码——有 除了一些方便之外,这里真的没什么特别的。)

    这正是我推荐的做法。

    【讨论】:

    • 谢谢!这就是我的想法。您对替换recvsend 也有任何见解吗?
    • 当然。请注意,loop.create_connection 的第一个参数称为protocol_factory。您需要找到(或编写)使用所需传输的Protocol interface 的实现。
    • 问题是传输是独立于协议创建的,recvsend 用于传输而不是协议 - 所以协议工厂在这里无济于事。
    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2018-07-07
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多