2013-04-12 80 views
1

我們有一個工作的uwsgi服務器,它帶有一些RPC調用(注意:我們可以使用uwsgi.rpc與進程交談,所以他們最終的設置很好)。我們發現我們有一些進程沒有在uwsgi下運行,我們想要與RPC服務器交談。縱觀uwsgi源,它看起來像它應該是比較容易從背後uwsgi沒有運行一個python程序進行溝通,但所有我們能夠得到的是:從非uwsgi進程與uwsgi RPC應用程序交談

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

任何你不是在使用uwsgi庫的理由? http://projects.unbit.it/uwsgi/wiki/RPC – Wolph

+0

我們在各地都在使用消費者。它看起來像我們可以使用uwsgi,但我們不得不添加一些插件(https://github.com/unbit/uwsgi/issues/29),我們需要uwsgi的唯一東西是發送RPC請求,所以它似乎是矯枉過正。 –

回答

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