static void _remove_id(struct gate *g, int uid) { struct connection * conn = _id_to_agent(g,uid); assert(conn->uid == uid); conn->uid = 0; conn->agent = 0; }
static void _forward_agent(struct gate * g, int id, uint32_t agentaddr, uint32_t clientaddr) { struct connection * agent = _id_to_agent(g,id); if (agent) { agent->agent = agentaddr; agent->client = clientaddr; } }
static void _forward_agent(struct gate * g, int id, const char * agentaddr, const char *clientaddr) { struct connection * agent = _id_to_agent(g,id); if (agent->agent) { free(agent->agent); } agent->agent = strdup(agentaddr); if (agent->client) { free(agent->client); } agent->client = strdup(clientaddr); }
static void _ctrl(struct skynet_context * ctx, struct gate * g, const void * msg, int sz) { char tmp[sz+1]; memcpy(tmp, msg, sz); tmp[sz] = '\0'; char * command = tmp; int i; if (sz == 0) return; for (i=0;i<sz;i++) { if (command[i]==' ') { break; } } if (memcmp(command,"kick",i)==0) { _parm(tmp, sz, i); int uid = strtol(command , NULL, 10); struct connection * agent = _id_to_agent(g,uid); if (agent) { int connection_id = agent->connection_id; mread_close_client(g->pool,connection_id); } return; } if (memcmp(command,"forward",i)==0) { _parm(tmp, sz, i); char * client = tmp; char * idstr = strsep(&client, " "); if (client == NULL) { return; } int id = strtol(idstr , NULL, 10); char * agent = strsep(&client, " "); if (client == NULL) { return; } uint32_t agent_handle = strtoul(agent+1, NULL, 16); uint32_t client_handle = strtoul(client+1, NULL, 16); _forward_agent(g, id, agent_handle, client_handle); return; } if (memcmp(command,"broker",i)==0) { _parm(tmp, sz, i); g->broker = skynet_queryname(ctx, command); return; } if (memcmp(command,"start",i) == 0) { skynet_command(ctx,"TIMEOUT","0"); return; } skynet_error(ctx, "[gate] Unkown command : %s", command); }
static void _forward(struct skynet_context * ctx,struct gate *g, int uid, void * data, size_t len) { if (g->broker) { skynet_send(ctx, 0, g->broker, g->client_tag, 0, data, len); return; } struct connection * agent = _id_to_agent(g,uid); if (agent->agent) { skynet_send(ctx, agent->client, agent->agent, g->client_tag, 0 , data, len); } else if (g->watchdog) { char * tmp = malloc(len + 32); int n = snprintf(tmp,len+32,"%d data ",uid); memcpy(tmp+n,data,len); skynet_send(ctx, 0, g->watchdog, PTYPE_TEXT | PTYPE_TAG_DONTCOPY, 0, tmp, len + n); } }
static void _forward(struct skynet_context * ctx,struct gate *g, int uid, void * data, size_t len) { if (g->broker) { skynet_send(ctx, NULL, g->broker, SESSION_CLIENT, data, len, 0); return; } struct connection * agent = _id_to_agent(g,uid); if (agent->agent) { // todo: client package has not session , send 0x7fffffff skynet_send(ctx, agent->client, agent->agent, SESSION_CLIENT, data, len, 0); } else if (g->watchdog) { char * tmp = malloc(len + 32); int n = snprintf(tmp,len+32,"%d data ",uid); memcpy(tmp+n,data,len); skynet_send(ctx, NULL, g->watchdog, 0, tmp, len + n, DONTCOPY); } }