import socket
import struct
import sys
from threading import Thread
from Queue import Queue
class UmdfStream:
def __init__(self, grp, port):
self.grp = grp
self.port = port
self.q = Queue()
self.t = Thread(target=self.worker)
self.t.daemon = True
self.buff = ''
self.t.start()
def connect( self ):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', self.port))
mreq = struct.pack("4sl", socket.inet_aton(self.grp), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
self.q.put( sock.recv(1500) )
def worker( self ):
needmore = False
while True:
if needmore:
data = self.q.get()
self.q.task_done()
needmore = False
if self.buff == '':
data = self.q.get()
pkt_size = len( data )
if pkt_size < 10:
self.buff += data
else:
hdr_seq_num = struct.unpack('!i', data[0:4])[0]
hdr_num_chucks = struct.unpack('!h', data[4:6])[0]
hdr_cur_chuck = struct.unpack('!h', data[6:8])[0]
print 'decoding msg seq:', hdr_seq_num, ' chuck: ', hdr_cur_chuck, '/', hdr_num_chucks
self.q.task_done()
if __name__ == '__main__':
if len(sys.argv) < 3:
print 'Usage:', sys.argv[0], ' multicast ip, port'
sys.exit(1)
stream = UmdfStream( sys.argv[1], int(sys.argv[2]) )
stream.connect()
Para usar: python umdf.py 233.252.8.57 10007 ( para ver as mensagens do canal de indice futuro chegando )
Este pedaço de codigo, auxilia identificar rapidamente se o sinal UMDF esta chegando ate a maquina ;)
sábado, 8 de setembro de 2012
BM&FBOVESPA - UMDF and Python
Assinar:
Postagens (Atom)