从非uwsgi进程与uwsgi RPC应用程序对话

时间:2013-04-12 22:31:41

标签: python rpc uwsgi

我们有一个工作的uwsgi服务器带有一些RPC调用(注意:我们可以使用uwsgi.rpc与进程通信,因此它们的设置很好)。我们发现有些进程没有在uwsgi下运行,我们希望与RPC服务器通信。看看uwsgi源代码,看起来从一个没有在uwsgi后面运行的python进程进行通信看起来相对容易,但我们能得到的只有:

read(): Resource temporarily unavailable [proto/uwsgi.c line 75]
Fri Apr 12 15:21:07 2013 - error parsing request

这是我们正在使用的代码。我认为它正确地打包了数据,但我不确定它为什么不起作用:

import socket
from struct import pack

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(('127.0.0.1', 3035))

fun = 'test_fun'
arg = 'hi'
ulen = len(fun)
arglen = len(arg)
buflen = (2 + ulen) + (2 + arglen)
buf = pack('!B', 173)
buf += pack('!H', buflen)
buf += pack('!B', 0)
buf += pack('!B', ulen & 0xff)
buf += pack('!B', (ulen>>8) & 0xff)
buf += fun
buf += pack('!B', arglen & 0xff)
buf += pack('!B', (arglen>>8) & 0xff)
buf += arg

sent = c.send(buf)
c.close()

1 个答案:

答案 0 :(得分:1)

你需要将标题与正文分开发送,函数+参数的长度必须是小端。

fun = 'test_fun'                                                     
arg = 'hi'                                                                          
ulen = len(fun)                                                                    
arglen = len(arg)                                                                  
buflen = (2 + ulen) + (2 + arglen)                                                 
buf = pack('!B', 173)                                                              
buf += pack('<H', buflen)                                                          
buf += pack('!B', 0)                                                               
c.send(buf)                                     

buf = pack('!B', ulen & 0xff)                                                      
buf += pack('!B', (ulen>>8) & 0xff)                                                
buf += fun                                                                         
buf += pack('!B', arglen & 0xff)                                                   
buf += pack('!B', (arglen>>8) & 0xff)                                              
buf += arg                                                                         
sent = c.send(buf)                                                                 
print "sent", sent