Example #1
0
File: main.c Project: errord/skynet
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;
}
Example #2
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;
	}
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
File: main.c Project: errord/skynet
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);
	}
}
Example #6
0
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);
	}
}