def get_message(self, from_addr, num=1, remove=False): """ 送信元アドレス指定で受信メッセージを取り出す。デフォルトでは1通のみ 取り出す。またデフォルトでは取り出してもメッセージはキューに残る 封書の場合は取り出した時点で開封通知が相手に届く :param from_addr: 取得したいメッセージの送信元アドレス :param num: 何通取り出すか。指定数未満のメッセージしない場合でもある限り取得する :param remove: 取得したメッセージをキューから削除するか(default=false) :return: IpmsgMessageインスタンスのリスト """ matched_received_list = [ msg for msg in self.received_que if msg.addr == from_addr ][0:num] for msg in matched_received_list: # 削除処理 if remove: logger.debug("Remove rcv:[%s:%s]" % (msg.packet_no, msg.addr)) self.received_que.remove(msg) # 封書の場合は開封パケットを送る # remove=Falseだと何回か開封パケットが飛ぶがエラーにはならないようなのでよしとする if msg.is_secretopt(): ip_msg = IpmsgMessage(msg.addr, msg.port, msg.packet_no, self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_READMSG) self._send(ip_msg) return matched_received_list
def get_message(self, from_addr, num=1, remove=False): """ 送信元アドレス指定で受信メッセージを取り出す。デフォルトでは1通のみ 取り出す。またデフォルトでは取り出してもメッセージはキューに残る 封書の場合は取り出した時点で開封通知が相手に届く :param from_addr: 取得したいメッセージの送信元アドレス :param num: 何通取り出すか。指定数未満のメッセージしない場合でもある限り取得する :param remove: 取得したメッセージをキューから削除するか(default=false) :return: IpmsgMessageインスタンスのリスト """ matched_received_list = [msg for msg in self.received_que if msg.addr == from_addr][0:num] for msg in matched_received_list: # 削除処理 if remove: logger.debug("Remove rcv:[%s:%s]" % (msg.packet_no, msg.addr)) self.received_que.remove(msg) # 封書の場合は開封パケットを送る # remove=Falseだと何回か開封パケットが飛ぶがエラーにはならないようなのでよしとする if msg.is_secretopt(): ip_msg = IpmsgMessage(msg.addr, msg.port, msg.packet_no, self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_READMSG) self._send(ip_msg) return matched_received_list
def _request_host_list(self): """ IPMSG_BR_ISGETLIST2を送信しホストリストを送ってくれる相手を探す :return: """ # 実行日を保持 self._last_get_listed_time = datetime.datetime.now() #1:801798212:root:falcon:6291480:(\00) for broad_addr in self.broad_cast_addrs: ip_msg = IpmsgMessage(broad_addr, self.use_port, "", self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_BR_ISGETLIST2) self._send(ip_msg)
def _entry(self): """ ネットワークに参加 ブロードキャストで伝える """ # Ver : PacketNo : User : Host : Command : Msg #send_msg = "1:%s:sayamada:B1308-66-01:%d:sayamada\00sayamada_group\00" % (self.get_packet_no(), command) send_msg = "%s\00%s" % (self.user_name, self.group_name) for broad_addr in self.broad_cast_addrs: ip_msg = IpmsgMessage(broad_addr, self.use_port, send_msg, self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_BR_ENTRY) self._send(ip_msg)
def okgetlist_action(self, msg): """ OKGETLISTを受け取ったら、相手にGETLISTを投げてホストリストを 要求する :param msg: 受信メッセージ :return: """ # add hostlist #logger.debug("okgetlist:" + msg.get_full_message()) # "1:100:sender:sender-pc:18:0" ip_msg = IpmsgMessage(msg.addr, msg.port, str(0), self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_GETLIST) self._send(ip_msg)
def br_entry_action(self, msg): """ BR_ENTRYを受け取ったらANSENTRYを戻して相手に自分を伝える。 さらに送信元を自分のホストリストに追加する :param msg: 受信メッセージ :return: """ logger.debug("br_entry:" + msg.get_full_message().__repr__()) send_msg = "%s\00%s" % (self.user_name, self.group_name) ip_msg = IpmsgMessage(msg.addr, msg.port, send_msg, self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_ANSENTRY) logger.debug("br_entry_re:" + ip_msg.get_full_message().__repr__()) self._send(ip_msg) # ホストリストへ追加 self._add_host_list(IpmsgHostinfoParser(msg))
def sendmsg_action(self, msg): """ ほかのホストからメッセージを受け取ったときのアクション RECVMSGは無視 :param msg: 受信メッセージ :return: """ logger.debug("sendmsg:" + msg.get_full_unicode_message()) # SENDCHEKOPTならRECVMSGを戻さないと相手は受信したことがわからない if msg.is_sendcheckopt(): ip_msg = IpmsgMessage(msg.addr, msg.port, msg.packet_no, self._get_packet_no(), self.user_name) ip_msg.set_flag(c.IPMSG_RECVMSG) self._send(ip_msg) # RCVの場合はただの返答パケットなので無視しないといけない if not msg.is_recvmsg(): self._sendmsg_handler(msg) msg.born_now() self.received_que.append(msg)
def send_message(self, to_addr, msg, is_secret=False): """ メッセージを送信する。実際は送信待ちキューへの追加 :param to_addr:送信先アドレス :param msg:送るメッセージの文字列 :param is_secret: 封書として送るか :return:送信完了追跡用のパケット番号 """ # Ver(1) : Packet No : MyUserName : MyHostName : Command : Extra packet_no = self._get_packet_no() # 送信に必要な情報を添えてIpmsgMessageインスタンスにする ip_msg = IpmsgMessage(to_addr, self.use_port, msg, packet_no, self.user_name) # IPMSG_SENDMSGフラグを立てる ip_msg.set_sendmsg() if is_secret: ip_msg.set_secretopt() self._send(ip_msg) return packet_no