我们从Python开源项目中,提取了以下41个代码示例,用于说明如何使用socket.IP_ADD_MEMBERSHIP。
def setup_sockets(self): self.sockets = {} ip_addresses = get_interface_addresses(self.logger) self.ip_addresses = ip_addresses multi_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) multi_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) multi_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, self.ttl) for ip in ip_addresses: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) mreq=socket.inet_aton(self.address)+socket.inet_aton(ip) multi_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) self.logger.info("Regestering multicast for: %s: %s"%(self.address, ip)) sock.bind((ip, self.port)) self.sockets[ip] = sock multi_sock.bind(("", self.port)) self.socks = [self.sockets[x] for x in self.sockets.keys()] self.multi_sock = multi_sock
def __init__(self, group_addr, port): bind_addr = '0.0.0.0' # Create a IPv4/UDP socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Avoid error 'Address already in use'. self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Construct a membership_request membership_request = socket.inet_aton(group_addr) + socket.inet_aton(bind_addr) # Send add membership request to socket self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, membership_request) # Bind the socket to an interfaces self.sock.bind((bind_addr, port)) # Set non-blocking receiving mode self.sock.setblocking(False) self.publisher = rospy.Publisher('/raw_referee', std_msgs.msg.String, queue_size=10)
def __init__(self, group_addr, port): bind_addr = '0.0.0.0' # Create a IPv4/UDP socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Avoid error 'Address already in use'. self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Construct a membership_request membership_request = socket.inet_aton(group_addr) + socket.inet_aton(bind_addr) # Send add membership request to socket self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, membership_request) # Bind the socket to an interfaces self.sock.bind((bind_addr, port)) # Set non-blocking receiving mode self.sock.setblocking(False) self.publisher = rospy.Publisher('/raw_vision', std_msgs.msg.String, queue_size=10)
def _create_mcast_socket(self): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if self._interface != 'any': if platform.system() != "Windows": sock.bind((self.MULTICAST_ADDRESS, self.MULTICAST_PORT)) else: sock.bind((self._interface, self.MULTICAST_PORT)) mreq = socket.inet_aton(self.MULTICAST_ADDRESS) + socket.inet_aton(self._interface) else: sock.bind((self.MULTICAST_ADDRESS, self.MULTICAST_PORT)) mreq = struct.pack("4sl", socket.inet_aton(self.MULTICAST_ADDRESS), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) return sock
def setEventCast(self, mcast='224.56.56.56', port=45654, bind='0.0.0.0'): ''' Tie this CobraEventCore to any others which share the same multicast ip and port. This basically creates a ( udp "unreliable" ) "bus" on which events are serialized using json. ''' # Setup a UDP casting socket self._ce_mcastport = port self._ce_mcasthost = mcast self._ce_ecastsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._ce_ecastsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._ce_ecastsock.bind((bind,port)) # Join the multicast IP mreq = struct.pack("4sL", socket.inet_aton(mcast), socket.INADDR_ANY) self._ce_ecastsock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) thr = threading.Thread(target=self._runSocketListener) thr.setDaemon(True) thr.start()
def __init__(self, server_address): self.server_address = server_address self.logger = logging.getLogger('VisionReceiver') self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.socket.bind(server_address) if ip_address(server_address[0]).is_multicast: self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, struct.pack("=4sl", socket.inet_aton(server_address[0]), socket.INADDR_ANY)) self.field = Field() self._detection_frame_queue = queue.Queue() self._thread = threading.Thread(target=self.receive_packet, daemon=True)
def create_sockets(mcst_ipaddr, mcst_port): mreq = struct.pack("4sl", socket.inet_aton(mcst_ipaddr), socket.INADDR_ANY) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) if platform.system() == "Windows": s.bind(("", mcst_port)) return (s, ) else: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) s.bind((mcst_ipaddr, mcst_port)) bsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) bsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) bsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) bsock.bind(("", 1901)) return (s, bsock)
def setup_ipv4_multicast_socket(ifaddrs, if_name, addr): #todo: if_name ignored s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(("", Config.udp_multicast.port)) s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, Config.udp_multicast.ttl) s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0) mreq = struct.pack("4sl", socket.inet_aton(addr), socket.INADDR_ANY) s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) s.setblocking(0) multicast_socket_ipv4.append((s,addr)) return True
def _create_mcast_socket(self): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if self._interface != 'any': if platform.system() != "Windows": sock.bind((self.MULTICAST_ADDRESS, self.MULTICAST_PORT)) else: sock.bind((self._interface, self.MULTICAST_PORT)) mreq = socket.inet_aton(self.MULTICAST_ADDRESS) + socket.inet_aton(self._interface) else: if platform.system() != "Windows": sock.bind((self.MULTICAST_ADDRESS, self.MULTICAST_PORT)) else: sock.bind(('', self.MULTICAST_PORT)) mreq = struct.pack("4sl", socket.inet_aton(self.MULTICAST_ADDRESS), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) return sock
def mkdatasock(ip_address=None, multicast_address=MULTICAST_ADDRESS, port=PORT_DATA): "Create a data socket." ip_address = gethostip() if not ip_address else ip_address datasock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) datasock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) datasock.bind((ip_address, port)) # join a multicast group mreq = struct.pack("=4sl", socket.inet_aton(multicast_address), socket.INADDR_ANY) datasock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) datasock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SOCKET_BUFSIZE) return datasock
def _joinAddr2(self, interface, addr, join): addr = socket.inet_aton(addr) interface = socket.inet_aton(interface) if join: cmd = socket.IP_ADD_MEMBERSHIP else: cmd = socket.IP_DROP_MEMBERSHIP try: self.socket.setsockopt(socket.IPPROTO_IP, cmd, addr + interface) except socket.error, e: return failure.Failure(error.MulticastJoinError(addr, interface, *e.args))
def _add_membership(self): """private: add multicast membership""" _LOGGER.debug("Joining multicast group...") sock = self.transport.get_extra_info("socket") group = socket.inet_aton(MCAST_ADDR) mreq = struct.pack("4sL", group, socket.INADDR_ANY) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) _LOGGER.debug("Multicast membership added")
def discover(self): ws = None usn = None apiV = None srv = None req = ('M-SEARCH * HTTP/1.1\r\n' + 'MX: 10\r\n' + 'HOST: 239.255.255.250:1900\r\n' + 'MAN: \"ssdp:discover\"\r\n' + 'NT: panono:ball-camera\r\n' + '\r\n') ws = None sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.settimeout(7) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) mcast = struct.pack('4sL', socket.inet_aton('239.255.255.250') , socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mcast) sock.bind(('', 1900)) try: sock.sendto( req.encode(), ('239.255.255.250', 1900)) except socket.error as e: print(e) return (None, None, None) for _ in range(5): try: data, addr = sock.recvfrom(1024) if not data: continue ws = ssdpNotify().getLocation(data) if ws is None: continue usn = ssdpNotify().getUsn(data) apiV = ssdpNotify().getApiVersion(data) srv = ssdpNotify().getSrv(data) break except socket.error as e: print(e) break sock.close() return (ws, usn, apiV, srv)
def receiver(service='mihome'): from plugins import gateway assert service in MULTICAST, 'No such service' store = get_store() address, port = MULTICAST.get(service) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("0.0.0.0", port)) mreq = struct.pack("=4sl", socket.inet_aton(address), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SOCKET_BUFSIZE) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) current = {} while True: data, _ = sock.recvfrom(SOCKET_BUFSIZE) # buffer size is 1024 bytes print(datetime.now().isoformat(), data) if service == 'mihome': message = json.loads(data.decode()) data = json.loads(message['data']) if message.get('model') in ('sensor_ht', 'weather.v1') and not sensor_ht.process(conn, cursor, current, message, data): continue elif message.get('model') == 'magnet': magnet.process(store, message, data) elif message.get('model') == 'gateway': gateway.process(store, message, data) current = {} elif service == 'yeelight': yeelight.process(data.decode())
def recv(self, callback): # Look up multicast group address in name server and find out IP version addrinfo = socket.getaddrinfo(self.group, None)[0] # Create a socket s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) # Allow multiple copies of this program on one machine # (not strictly needed) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Bind it to the port s.bind(('', self.port)) group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0]) # Join group if addrinfo[0] == socket.AF_INET: # IPv4 mreq = group_bin + struct.pack('=I', socket.INADDR_ANY) s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # Loop, printing any data we receive while True: if callback == None: return data, sender = s.recvfrom(1500) data = data.decode() while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's #callback(sender, data.split(':')) callback.put([sender, data])
def enableMulticast(self): while not self.running: pass mreq = struct.pack("4sl", socket.inet_aton(self.multicast_ip), socket.INADDR_ANY) self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) info("CoAP Server binded on coap://%s:%s/ (MULTICAST)" % (self.multicast_ip, self.port))
def mcast_add(self, addr): self.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(addr) + socket.inet_aton('0.0.0.0'))
def _create_mcast_socket(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.MULTICAST_ADDRESS, self.MULTICAST_PORT)) mreq = struct.pack("4sl", socket.inet_aton(self.MULTICAST_ADDRESS), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) return sock
def get_mdns_sock(self): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if sys.platform == 'darwin': sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) sock.bind(('', 5353)) mreq = struct.pack("4sl", socket.inet_aton('224.0.0.251'), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) return sock
def create_multicast_sock(own_ip, remote_addr, bind_to_multicast_addr): """Create UDP multicast socket.""" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setblocking(False) sock.setsockopt( socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(own_ip)) sock.setsockopt( socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(remote_addr[0]) + socket.inet_aton(own_ip)) sock.setsockopt( socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) sock.setsockopt( socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(own_ip)) # I have no idea why we have to use different bind calls here # - bind() with multicast addr does not work with gateway search requests # on some machines. It only works if called with own ip. # - bind() with own_ip does not work with ROUTING_INDICATIONS on Gira # knx router - for an unknown reason. if bind_to_multicast_addr: sock.bind((remote_addr[0], remote_addr[1])) else: sock.bind((own_ip, 0)) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0) return sock
def __get_xml_files(self, mc_grp, mc_port): try: loop = True chunk = {"end": 0} max_files = 1000 _files = {} first_file = '' logger.debug('Descargando XML de %s:%s' % (mc_grp, mc_port)) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.settimeout(3) sock.bind((mc_grp, int(mc_port))) mreq = struct.pack("=4sl", socket.inet_aton(mc_grp), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # Wait for an end chunk to start by the beginning while not (chunk["end"]): chunk = self.__parse_chunk(sock.recv(1500)) first_file = str(chunk["filetype"]) + "_" + str(chunk["fileid"]) # Loop until firstfile while loop: xmldata = "" chunk = self.__parse_chunk(sock.recv(1500)) # Discard headers body = chunk["data"] while not (chunk["end"]): xmldata += body chunk = self.__parse_chunk(sock.recv(1500)) body = chunk["data"] # Discard last 4bytes binary footer? xmldata += body[:-4] _files[str(chunk["filetype"]) + "_" + str(chunk["fileid"])] = xmldata logger.debug('XML: %s_%s' % (chunk["filetype"], chunk["fileid"])) max_files -= 1 if str(chunk["filetype"]) + "_" + str(chunk["fileid"]) == first_file or max_files == 0: loop = False sock.close() return _files except Exception, ex: logger.error('Error al descargar los archivos XML: %s' % ex.args)
def subscribe_multicast(interface): """subscribe to the mcast addr""" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(interface.ipv4_address)) mreq = socket.inet_aton(interface.mcastaddr) + socket.inet_aton(interface.ipv4_address) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) sock.bind(('', 52122)) return sock
def receiver(group): # Look up multicast group address in name server and find out IP version addrinfo = socket.getaddrinfo(group, None)[0] # Create a socket s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) # Allow multiple copies of this program on one machine # (not strictly needed) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Bind it to the port s.bind(('', MYPORT)) group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0]) # Join group if addrinfo[0] == socket.AF_INET: # IPv4 mreq = group_bin + struct.pack('=I', socket.INADDR_ANY) s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) else: mreq = group_bin + struct.pack('@I', 0) s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) # Loop, printing any data we receive while True: data, sender = s.recvfrom(1500) while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's print (str(sender) + ' ' + repr(data))
def __init__(self, name, maxwidth=multiprocessing.cpu_count(), docode=False): self.go = True self.name = name self.width = 0 self.maxwidth = maxwidth self.verbose = False self.docode = docode self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.sock.bind(("",cluster_port)) mreq = struct.pack("4sL", socket.inet_aton(cluster_ip), socket.INADDR_ANY) self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def Connect(self): self.socket_mode = UDP_MODE self.mac = uuid.getnode() # Set up UDP receiver. self.udp_rx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp_rx_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Pack multicast group structure correctly. mreq = struct.pack('=4sl', socket.inet_aton(MCAST_GRP),socket.INADDR_ANY) # Request access to multicast group. self.udp_rx_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # Bind to all intfs. self.udp_rx_sock.bind(('', MCAST_PORT)) self.udp_rx_sock.settimeout(TIMEOUT) # Set up UDP transmitter. self.udp_tx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp_tx_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) # Get the MAC address of the local adapter. msg = bytearray(8) struct.pack_into('<Q', msg, 0, int(self.mac)) self.local_mac = ''.join('{:02x}'.format(x) for x in msg[0:6]) logging.debug('MAC Addr: %s', self.local_mac)
def run(self): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Bind to the server address sock.bind(("", self.port)) group = socket.inet_aton(_MCAST_ANY) mreq = struct.pack("4sL", group, socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) while True: data = sock.recv(1400) packet = Packet.readFrom(BytesIO(data)) for listener in self.listeners: listener.handlePacket(packet)
def run(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if hasattr(socket, "SO_REUSEPORT"): try: self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except socket.error as le: # RHEL6 defines SO_REUSEPORT but it doesn't work if le.errno == ENOPROTOOPT: pass else: raise addr = socket.inet_aton(SSDP_ADDR) interface = socket.inet_aton('0.0.0.0') cmd = socket.IP_ADD_MEMBERSHIP self.sock.setsockopt(socket.IPPROTO_IP, cmd, addr + interface) self.sock.bind(('0.0.0.0', SSDP_PORT)) self.sock.settimeout(1) while True: try: data, addr = self.sock.recvfrom(1024) self.datagram_received(data, addr) except socket.timeout: continue self.shutdown()
def setUdpSocketForMulticastReceive(sock, multicastGroupTuple, ipAddressStrOfMulticastInterface): sock.bind(("", multicastGroupTuple[1])) sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(multicastGroupTuple[0]) + socket.inet_aton(ipAddressStrOfMulticastInterface)) # # gets the IP address (as string) of local hostname #
def run(self): # XXX: why does self.server_bind() fail??? ## import pdb; pdb.set_trace() try: # bind and activate the server self.server_bind() self.server_activate() except: # close the server self.server_close() # propagate the error raise try: # join the multicast group self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, self._group_member) # process requests until stopped self.serve_forever() finally: # leave the multicast group self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_DROP_MEMBERSHIP, self._group_member) # close the server self.server_close()
def _joinAddr2(self, interface, addr, join): addr = socket.inet_aton(addr) interface = socket.inet_aton(interface) if join: cmd = socket.IP_ADD_MEMBERSHIP else: cmd = socket.IP_DROP_MEMBERSHIP try: self.socket.setsockopt(socket.IPPROTO_IP, cmd, addr + interface) except socket.error as e: return failure.Failure(error.MulticastJoinError(addr, interface, *e.args))
def join(self, multicast_addr): with self.lock: if multicast_addr not in self.multicastSet: self.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(multicast_addr) + socket.inet_aton(self.bind_addr)) self.multicastSet.add(multicast_addr) if self.callback_obj is not None: self.callback_obj.on_join(self, multicast_addr) # for RECEIVER to stop receiving datagram from the multicast group
def getData( self, mgroup, hostip, port=29495, pkts=1000, pktlen=1080, block=True, returnSddsAnalyzer=True): totalRead=0.0 startTime = _time.time() sock = None ismulticast=False blen=10240 bytesRead=0 requestedBytes=pkts*pktlen data=[] rawdata='' try: try: ip_class=int(mgroup.split('.')[0]) if ip_class == '224' or ip_class == '239': ismulticast=True except: pass #print " Capturing ", mgroup, " host ", hostip, " port ", port sock = _socket.socket(_socket.AF_INET, _socket.SOCK_DGRAM, _socket.IPPROTO_UDP) sock.setsockopt(_socket.SOL_SOCKET, _socket.SO_REUSEADDR, 1) sock.bind(("",port)) if ismulticast: mreq=struct.pack('4s4s',_socket.inet_aton(mgroup),_socket.inet_aton(hostip)) sock.setsockopt(_socket.IPPROTO_IP, _socket.IP_ADD_MEMBERSHIP, mreq) print "Capturing Socket Interface: (MULTICAST) Host Interface: " + hostip + " Multicast: " + mgroup + " Port: "+ str(port) else: print "Capturing Socket Interface: (UDP) Host Interface: " + hostip + " Source Address: " + mgroup + " Port: "+ str(port) ncnt=0 while totalRead < requestedBytes: rcvddata = sock.recv(blen,_socket.MSG_WAITALL) rawdata=rawdata+rcvddata data=data+list(rcvddata) totalRead = totalRead + len(rcvddata) ncnt += 1 print " read ", ncnt, " pkt ", len(rcvddata) except KeyboardInterrupt,e : traceback.print_exc() print "Exception during packet capture: " + str(e) except Exception, e : traceback.print_exc() print "Exception during packet capture: " + str(e) finally: endTime=_time.time() deltaTime=endTime -startTime if sock: sock.close() print "Elapsed Time: ", deltaTime, " Total Data (kB): ", totalRead/1000.0, " Rate (kBps): ", (totalRead/1000.0)/deltaTime if returnSddsAnalyzer: from ossie.utils.sdds import SDDSAnalyzer return SDDSAnalyzer( rawdata, pkts, pktlen, totalRead ) else: return data, rawdata, (pktlen,pkts,totalRead)
def get_multicast_socket(sock=None): if not sock: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(0.001) # set multicast interface to any local interface sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton('0.0.0.0')) # Enable multicast, TTL should be <32 (local network) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 5) # Allow reuse of addresses sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Allow receiving multicast broadcasts (subscribe to multicast group) try: mreq = struct.pack('4sL', socket.inet_aton(multicast_ip), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) # Do not loop back own messages sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 0) except OSError as e: logger.error('Unable to obtain socket with multicast enabled.') raise e port = None for i in range(30100, 30105): try: # Binding to 0.0.0.0 results in multiple messages if there is multiple interfaces available # Kept as-is to avoid losing messages sock.bind(('0.0.0.0', i)) port = i break except OSError as e: # Socket already in use without SO_REUSEADDR enabled continue if not port: raise RuntimeError('No IMC multicast ports free on local interface.') return sock
def run(self): try: PLUGIN.responderLogger.debug("Responder.run called") sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) try: sock.bind(('', UPNP_PORT)) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(BCAST_IP) + socket.inet_aton(PLUGIN.globals['alexaHueBridge'][self.ahbDevId]['host'])) sock.settimeout(1) start_time = time.time() end_time = start_time + (PLUGIN.globals['alexaHueBridge'][self.ahbDevId]['discoveryExpiration'] * 60) while True: try: data, addr = sock.recvfrom(1024) # Following code will only time out the Broadcaster Thread if PLUGIN.globals['alexaHueBridge'][self.ahbDevId]['discoveryExpiration'] > 0 (valid values 0 thru 10 inclusive) # A value of zero means 'always on' if PLUGIN.globals['alexaHueBridge'][self.ahbDevId]['discoveryExpiration'] and time.time() > end_time: PLUGIN.responderLogger.debug("Responder.run thread timed out") self.stop() raise socket.error except socket.error: if self.interrupted: PLUGIN.responderLogger.debug("Responder.run: self.interrupted: True") PLUGIN.setDeviceDiscoveryState(False, self.ahbDevId) sock.close() return else: if M_SEARCH_REQ_MATCH in data: PLUGIN.responderLogger.debug("Responder.run: received: {}".format(str(data))) self.respond(addr) except socket.error as e: # This is the exception thrown when someone else has bound to the UPNP port, so write some errors and # stop the thread (which really isn't needed, but it logs a nice stop debug message). if e.errno == errno.EADDRINUSE: PLUGIN.responderLogger.error(u"'{}' Responder startup failed because another app or plugin is using the UPNP port.".format(indigo.devices[self.ahbDevId].name)) PLUGIN.responderLogger.error(u"Open a terminal window and type 'sudo lsof -i :{}}' to see a list of processes that have bound to that port and quit those applications.".format(UPNP_PORT)) self.stop() elif e.errno == errno.EADDRNOTAVAIL: PLUGIN.responderLogger.error(u"'{}' Responder startup failed because host address is not available.".format(indigo.devices[self.ahbDevId].name)) PLUGIN.responderLogger.error(u"Double check that the host is specified correctly in the Plugin Config. Correct if invalid and then reload the plugin.") self.stop() else: PLUGIN.responderLogger.error("'{}' Responder.run: socket error: {}".format(indigo.devices[self.ahbDevId].name, e)) PLUGIN.setDeviceDiscoveryState(False, self.ahbDevId) except StandardError, e: PLUGIN.responderLogger.error(u"StandardError detected in Responder.Run for '{}'. Line '{}' has error='{}'".format(indigo.devices[self.ahbDevId].name, sys.exc_traceback.tb_lineno, e))
def __init__(self, bindaddress=None): """Creates an instance of the Zeroconf class, establishing multicast communications, listening and reaping threads.""" globals()['_GLOBAL_DONE'] = 0 self.intf = bindaddress self.group = ('', _MDNS_PORT) self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except Exception: # SO_REUSEADDR should be equivalent to SO_REUSEPORT for # multicast UDP sockets (p 731, "TCP/IP Illustrated, # Volume 2"), but some BSD-derived systems require # SO_REUSEPORT to be specified explicity. Also, not all # versions of Python have SO_REUSEPORT available. So # if you're on a BSD-based system, and haven't upgraded # to Python 2.3 yet, you may find this library doesn't # work as expected. # pass self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255) self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1) try: self.socket.bind(self.group) except Exception: # Some versions of linux raise an exception even though # the SO_REUSE* options have been set, so ignore it # pass if self.intf is not None: self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0')) self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0')) self.listeners = [] self.browsers = [] self.services = {} self.cache = DNSCache() self.condition = threading.Condition() self.engine = Engine(self) self.listener = Listener(self) self.reaper = Reaper(self)
def client_update (self): update_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) #Set socket reuse, may not work on all OSs. try: update_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) except: pass #Attempt to bind to the socket to recieve and send data. If we can;t do this, then we cannot send registration try: update_sock.bind(('0.0.0.0',self.client_update_port)) except: self.__printDebug( "Error: Unable to bind to port [%s] - client will not be registered" % self.client_update_port, 0) return update_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) status = update_sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(self._multicast_address) + socket.inet_aton('0.0.0.0')) update_sock.setblocking(0) self.__printDebug("Sending registration data: HELLO %s\r\n%s" % (self.client_header, self.client_data), 3) #Send initial client registration try: update_sock.sendto("HELLO %s\r\n%s" % (self.client_header, self.client_data), self.client_register_group) except: self.__printDebug( "Error: Unable to send registeration message" , 0) #Now, listen for client discovery reguests and respond. while self._registration_is_running: try: data, addr = update_sock.recvfrom(1024) self.__printDebug("Recieved UDP packet from [%s] containing [%s]" % (addr, data.strip()), 3) except socket.error, e: pass else: if "M-SEARCH * HTTP/1." in data: self.__printDebug("Detected client discovery request from %s. Replying" % ( addr ,) , 2) try: update_sock.sendto("HTTP/1.0 200 OK\r\n%s" % self.client_data, addr) except: self.__printDebug( "Error: Unable to send client update message",0) self.__printDebug("Sending registration data: HTTP/1.0 200 OK\r\n%s" % (self.client_data), 3) self.client_registered = True time.sleep(0.5) self.__printDebug("Client Update loop stopped",1) #When we are finished, then send a final goodbye message to deregister cleanly. self.__printDebug("Sending registration data: BYE %s\r\n%s" % (self.client_header, self.client_data), 3) try: update_sock.sendto("BYE %s\r\n%s" % (self.client_header, self.client_data), self.client_register_group) except: self.__printDebug( "Error: Unable to send client update message" ,0) self.client_registered = False
def __init__( self, interfaces=InterfaceChoice.All, ): """Creates an instance of the Zeroconf class, establishing multicast communications, listening and reaping threads. :type interfaces: :class:`InterfaceChoice` or sequence of ip addresses """ # hook for threads self._GLOBAL_DONE = False self._listen_socket = new_socket() interfaces = normalize_interface_choice(interfaces, socket.AF_INET) self._respond_sockets = [] for i in interfaces: log.debug('Adding %r to multicast group', i) try: self._listen_socket.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton(i)) except socket.error as e: if get_errno(e) == errno.EADDRINUSE: log.info( 'Address in use when adding %s to multicast group, ' 'it is expected to happen on some systems', i, ) elif get_errno(e) == errno.EADDRNOTAVAIL: log.info( 'Address not available when adding %s to multicast ' 'group, it is expected to happen on some systems', i, ) continue else: raise respond_socket = new_socket() respond_socket.setsockopt( socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(i)) self._respond_sockets.append(respond_socket) self.listeners = [] self.browsers = {} self.services = {} self.servicetypes = {} self.cache = DNSCache() self.condition = threading.Condition() self.engine = Engine(self) self.listener = Listener(self) self.engine.add_reader(self.listener, self._listen_socket) self.reaper = Reaper(self) self.debug = None
def run(self): """Run the server.""" # Listen for UDP port 1900 packets sent to SSDP multicast address ssdp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ssdp_socket.setblocking(False) # Required for receiving multicast ssdp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ssdp_socket.setsockopt( socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.host_ip_addr)) ssdp_socket.setsockopt( socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton("239.255.255.250") + socket.inet_aton(self.host_ip_addr)) ssdp_socket.bind(("239.255.255.250", 1900)) while True: if self._interrupted: clean_socket_close(ssdp_socket) return try: read, _, _ = select.select( [self._interrupted_read_pipe, ssdp_socket], [], [ssdp_socket]) if self._interrupted_read_pipe in read: # Implies self._interrupted is True clean_socket_close(ssdp_socket) return elif ssdp_socket in read: data, addr = ssdp_socket.recvfrom(1024) else: continue except socket.error as ex: if self._interrupted: clean_socket_close(ssdp_socket) return _LOGGER.error("UPNP Responder socket exception occured: %s", ex.__str__) if "M-SEARCH" in data.decode('utf-8'): # SSDP M-SEARCH method received, respond to it with our info resp_socket = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) resp_socket.sendto(self.upnp_response, addr) resp_socket.close()