我正在尝试学习如何在 Python 3.7 中使用 AsyncIO,但我仍然对其原理有些困惑。
我的目标是编写一个简单的聊天程序,但是我需要使用环形网络拓扑——一个节点只知道它的两个邻居。当消息被发送时,它会被节点传递,直到它再次到达发送者。这意味着每个节点基本上同时是客户端和服务器。
我还需要能够检测到死节点,以便我的环不会损坏。
我认为每个节点为每个邻居建立单独的连接可能是一个很好的解决方案 -successor和predecessor.
class Node:
...
def run():
...
s = loop.create_connection(lambda: Client(...), addr1, port1)
p = loop.create_server(lambda: Server(...), addr2, port2)
successor = loop.run_until_complete(s)
predecessor = loop.run_until_complete(p)
loop.run_forever()
...
...
Run Code Online (Sandbox Code Playgroud)
Server并且Client是实现asyncio.Protocol.
我想这样做的原因是,如果有消息通过圈子发送,它总是从 发送predecessor到successor。在I 的connection_lost方法中,predecessor我可以检测到它已断开连接并发送它predecessor的消息(通过整个环)以连接到我。
我希望能够将我从我predecessor进一步收到的消息发送到我的successor. 我还希望能够将包含我的地址的消息发送给我successor,以防万一我predecessor死了(此消息将从predecessor's发送Server.connection_lost()并一直传递到我死者predecessor的predecessor)。
我的问题是:我可以将接收到的数据从predecessor …
有没有办法以编程方式从x86架构上的二进制可执行文件中读取给定数量的指令?
如果我有一个简单的C程序的二进制文件hello.c:
#include <stdio.h>
int main(){
printf("Hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在使用编译后gcc,反汇编函数main如下所示:
000000000000063a <main>:
63a: 55 push %rbp
63b: 48 89 e5 mov %rsp,%rbp
63e: 48 8d 3d 9f 00 00 00 lea 0x9f(%rip),%rdi # 6e4 <_IO_stdin_used+0x4>
645: e8 c6 fe ff ff callq 510 <puts@plt>
64a: b8 00 00 00 00 mov $0x0,%eax
64f: 5d pop %rbp
650: c3 retq
651: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
658: 00 00 …Run Code Online (Sandbox Code Playgroud)