示例#1
0
 def __init__(self, type, addr='0.0.0.0', port=0):
     
     self.__addr = addr
     self.__port = port
     self.__hash = None
     
     self.__thead = EEGTransportHeader() 
     
     self.__num = 1
     
     self.__type = type
     
     if isinstance(type, socket):
         if __debug__:
             print 'Accepted socket.'
         self.__eegsocket = type         
     else:                       
         if type not in self.__types:
             raise EEGTransportException('Unknown socket type')          
         
         if type=='tcp_serv':
             self.__eegsocket = socket(AF_INET, SOCK_STREAM)
             self.__eegsocket.bind( (addr, port) )
             self.__eegsocket.listen(10)
         
         if type=='tcp_cl':
             self.__eegsocket = socket(AF_INET, SOCK_STREAM)   
             self.__eegsocket.connect( (addr, port) )                
             
         if type=='udp_m_serv':
             self.__eegsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)   
             self.__eegsocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
             self.__eegsocket.bind( ('', port) )
             
             mreq = struct.pack('4sl', inet_aton(addr), INADDR_ANY)
             
             self.__eegsocket.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
             
         if type=='udp_m_cl':
             self.__eegsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
             self.__eegsocket.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, 2)
示例#2
0
class EEGTransport:
    'Class for creation data connections sockets.'
    
    __types = ['tcp_cl', 'tcp_serv', 'udp_m_cl', 'udp_m_serv']
    
    __chunk_size = 768
    
    def __init__(self, type, addr='0.0.0.0', port=0):
        
        self.__addr = addr
        self.__port = port
        self.__hash = None
        
        self.__thead = EEGTransportHeader() 
        
        self.__num = 1
        
        self.__type = type
        
        if isinstance(type, socket):
            if __debug__:
                print 'Accepted socket.'
            self.__eegsocket = type         
        else:                       
            if type not in self.__types:
                raise EEGTransportException('Unknown socket type')          
            
            if type=='tcp_serv':
                self.__eegsocket = socket(AF_INET, SOCK_STREAM)
                self.__eegsocket.bind( (addr, port) )
                self.__eegsocket.listen(10)
            
            if type=='tcp_cl':
                self.__eegsocket = socket(AF_INET, SOCK_STREAM)   
                self.__eegsocket.connect( (addr, port) )                
                
            if type=='udp_m_serv':
                self.__eegsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)   
                self.__eegsocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
                self.__eegsocket.bind( ('', port) )
                
                mreq = struct.pack('4sl', inet_aton(addr), INADDR_ANY)
                
                self.__eegsocket.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
                
            if type=='udp_m_cl':
                self.__eegsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
                self.__eegsocket.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, 2)
                
    
    def accept(self):
        if self.__type == 'udm_m_serv' or self.__type == 'udp_m_cl':
            raise EEGTransportException('Unsupported method "accept" for this type of connection')
        newsock, newaddr = self.__eegsocket.accept()
        newconn = EEGTransport(newsock, newaddr)
        return newconn
        
    def __recv(self, count):
                return self.__eegsocket.recv(count)
                
#                l=[]
#                torecv = count
#                while (torecv > 0) {
#                        d = self.__eegsocket.recv(torecv)
#                        l.append(d)
#                        torecv = torecv - len(d)
#                }
#                return ''.join(l)
        
    def __send(self, data):
        if self.__type == 'udm_m_serv' or self.__type == 'udp_m_cl':
            self.__eegsocket.sendto(data, (self.__addr, self.__port))
        elif self.__type == 'tcp_serv' or self.__type == 'tcp_cl':
            self.__eegsocket.send(data)
            
    def close(self):
        self.__eegsocket.close()
        
    def getTransportHeader(self):
        return self.__thead
    
    def getData(self):
        pass

    def sendChunked(self, data):
        print 'num: ',self.__num, ', orig size: ',len(data),
        data=bz2.compress(data,6)
        print ', compressed: ',len(data)
        header = self.__thead.getTransportHeader()
        hlen = len(header)
        dlen = len(data)
        dchunk = self.__chunk_size - hlen
        count =  dlen / dchunk
        if dlen % dchunk > 0:
            count+=1            
            
        for i in xrange(count):
            # if __debug__:
            #   print 'packet: ' + str(self.__num) + ' chunks: ' + str(count) + ' chunk: ' + str(i) + '\n'
            self.__thead.setNum(self.__num)
            self.__thead.setChunks(count)
            self.__thead.setChunk(i)
            header = self.__thead.getTransportHeader()
            self.__send(header + data[(dchunk*i):(dchunk*i + dchunk)])
        self.__num += 1


    def recvData(self):
        wait_for_chunk = 0  
        data = []
        while self.__thead.getChunks() == 0 or wait_for_chunk < self.__thead.getChunks():
            chunk = self.__recv(self.__chunk_size)
            self.__thead.setTransportHeader(chunk)
            
            if self.__hash != self.__thead.getHash():
                if self.__hash == None:
                    self.__hash = self.__thead.getHash()
                else:
                    self.__hash = self.__thead.getHash()
                    raise EEGFmtChangedException#('EEGData format changed')
            
            if wait_for_chunk != self.__thead.getChunk():
                if __debug__:
                    sys.stderr.write('skipping packet: ' + str(self.__num)\
                                                         + ' chunk: ' + str(self.__thead.getChunk()) + '\n')
                wait_for_chunk = 0
                data = []
            data.append(chunk[self.__thead.getFullHeaderLen():])
            wait_for_chunk += 1
            self.__num = self.__thead.getNum()

        #return concatenate(data)   
        return  ''.join(data)

    def recvChunked(self):

        #print 'compressed size: ',len(data),
        while(True):
            data = self.recvData() 
            try:
                #print len(data)
                orig = bz2.decompress(data)
            except Exception as e:
                sys.stderr.write('Decompress error, skipping \
                    packet: ' + str(self.__num) +'\n')
                print(e)
            else:
                header = self.__thead.getEEGHeader()
                size = header.n_channels * header.n_points * 4
                if size != len(orig):
                    sys.stderr.write('Wrong size of packet:' +\
                        str(len(orig)) +\
                        'must be ' + str(size) + '\n')
                else:
                    break
                #print 'orig size: ',len(orig)
        return orig