static int _maincb(struct skynet_context * context, void * ud, int type, int session, uint32_t source, const void * msg, size_t sz) { const struct localcast *lc = msg; size_t s = lc->sz | type << HANDLE_REMOTE_SHIFT; struct skynet_multicast_message * mc = skynet_multicast_create(lc->msg, s, source); skynet_multicast_cast(context, mc, lc->group, lc->n); free((void *)lc->group); return 0; }
// 多播的主要处理函数 static int _maincb(struct skynet_context * context, void * ud, int type, int session, uint32_t source, const void * msg, size_t sz) { struct skynet_multicast_group *g = ud; // PTYPE_SYSTEM 协议控制命令 if (type == PTYPE_SYSTEM) { char cmd = '\0'; uint32_t handle = 0; sscanf(msg,"%c %x",&cmd,&handle); // 格式化参数 if (handle == 0) { skynet_error(context, "Invalid handle %s",msg); return 0; } // 简单的命令协议 switch (cmd) { case 'E': skynet_multicast_entergroup(g, handle); break; case 'L': skynet_multicast_leavegroup(g, handle); break; case 'C': skynet_command(context, "EXIT", NULL); break; default: skynet_error(context, "Invalid command %s",msg); break; } return 0; } // 发送消息出去 else { sz |= type << HANDLE_REMOTE_SHIFT; struct skynet_multicast_message * mc = skynet_multicast_create(msg, sz, source); skynet_multicast_castgroup(context, g, mc); return 1; } }