我正在尝试将以下基于 0MQ 的 HTTP 服务器示例翻译成 C 语言,请参见此处: Hintjens' blog into Python。
def test_http_socket():
ctx = zmq.Context()
sock = ctx.socket(zmq.ROUTER)
sock.setsockopt(zmq.ROUTER_RAW, 1)
sock.bind("tcp://*:8080")
while True:
id_bytes = sock.recv()
print("id=",id_bytes)
request = sock.recv()
print("request=",request)
if b'/close' in request:
return
sock.send(id_bytes, zmq.SNDMORE)
sock.send(b"""HTTP/1.0 200 OK
Content-Type: text/plain
Hello, world !""")
sock.send(zmq.NULL)
问题出在下一行,我尝试翻译 C 表达式
zmq_send (router, NULL, 0, 0);
在 Python 中,我有以下堆栈跟踪:
Traceback (most recent call last):
File "<pyshell#96>", line 1, in <module>
test_http_socket()
File "<pyshell#95>", line 18, in test_http_socket
sock.send(zmq.NULL)
File "socket.pyx", line 565, in zmq.backend.cython.socket.Socket.send (zmq\backend\cython\socket.c:5104)
File "socket.pyx", line 612, in zmq.backend.cython.socket.Socket.send (zmq\backend\cython\socket.c:4868)
File "socket.pyx", line 168, in zmq.backend.cython.socket._send_copy (zmq\backend\cython\socket.c:1914)
File "buffers.pxd", line 200, in buffers.asbuffer_r (zmq\backend\cython\socket.c:6833)
File "buffers.pxd", line 151, in buffers.asbuffer (zmq\backend\cython\socket.c:6270)
TypeError: 0 does not provide a buffer interface.
实际上,sock.send 只能用于发送缓冲区或消息。有没有办法从 Python 以另一种方式使用 0MQ 的 zmq_send 来发送 NULL 帧?
顺便说一句,Github 条目中的注释显示即使在 C 中它也可能不会关闭与客户端的连接。如何要求远程客户端关闭其连接(在 Python 中)?
我在 Windows 32 位上使用 libzmq 4.0.1 和 PyZMQ 14.0.1 而不是 Python 3.3.2。