2013-04-12 3 views
1

У нас есть рабочий сервер uwsgi с некоторыми вызовами RPC (Примечание: мы можем использовать uwsgi.rpc для общения с процессами, поэтому настройка на их конце хороша). Мы обнаружили, что у нас есть некоторые процессы, которые не работают под управлением uwsgi, которые мы хотим поговорить с серверами RPC. Глядя на источнике uwsgi, похоже, она должна быть относительно легко общаться с процессом питона не отстает uwsgi, но все мы можем получить это:Поговорите с uwsgi RPC-приложением из процесса uwsgi

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, так что похоже overkill. –

ответ

1

Вы должны послать заголовок над отдельно от тела, а длина вашей функции + аргумент должен быть немного endian.

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 
Смежные вопросы