示例#1
0
文件: core.c 项目: Learath2/sBNC
int core_run(void)
{
	int s_server = 0, s_listener = 0;
	bool running = true;

	struct pollfd fds[MAX_SOCKETS];

	store_init();
	net_init();

	state_init();

	if((s_server = srv_init()) < 0)
		return EXIT_FAILURE;

	if(srv_connect() == -1){
		ERR("srv_connect() failed. Exiting...");
		return EXIT_FAILURE;
	}

	if((s_listener = clt_init()) == -1){
		ERR("clt_init() failed. Exiting...");
		return EXIT_FAILURE;
	}

	memset(fds, 0 , sizeof(fds));

	net_poll_add(s_server, POLLIN);
	net_poll_add_listener(s_listener, POLLIN);

	while(running){
		net_poll(POLLTIMEOUT);
		proc_tick();

		for(int i = 0; i < net_nfds(); i++){
			while(net_socket_avail(i)){
				char msg[513] = "";
				net_socket_msg(i, msg, sizeof msg);
				proc_proc(i, msg);
			}
		}

		while(proc_wqueue_length()){
			wqueue_entry_t ent = proc_wqueue_head();
			net_socket_write(ENT_GET(ent, target), ENT_GET(ent, data), ENT_GET(ent, datasz));
			proc_wqueue_next();
		}
	}

	return EXIT_SUCCESS;
}
示例#2
0
void handle_client_read(struct net_service* ns, net_socket nd)
{
	char buff[1024];
	int ret;

	while((ret = net_socket_read(ns, nd, buff, sizeof(buff)/sizeof(buff[0]))) > 0)
	{
		if(ret < (int)(sizeof(buff)/sizeof(buff[0])) )
		{
			buff[ret] = 0;
			// printf("recv msg %s\n", buff);
			++msg_recv_count;
			if( net_socket_write(ns, nd, buff, ret) > 0)
			{
				++msg_send_count;
			}
		}
		else
		{
			// create lager buff,read again
			break;
		}
	}
}
示例#3
0
int main(int argc, char** argv)
{
	struct net_service* ns;
	pthread_t ts[2];
	struct net_event events[64];
	struct buff_pool* pool;
	int i;
	int ret;
	void* status;
	unsigned int e;
	struct net_config cfg;
	int count;
	param_type parm;
	char bf[1024];

	srand((unsigned)time(NULL));


	pool = buff_pool_create(1024, 64);
	if(!pool)
	{
		printf("buff_pool_create faild\n");
		exit(-1);
	}

	ns = net_create(1024 );
	if(!ns)
	{
		printf("open net_service faild\n");
		exit(-1);
	}

	for(i = 0; i < (int)(sizeof(ts)/sizeof(ts[0])); ++i)
	{
		pthread_create(ts + i, 0, thread_run, ns);
	}

	count = 0;

	while(1)
	{
		ret = net_queue(ns, events, sizeof(events)/sizeof(events[0]));
		if(ret < 0)
		{
			break;
		}
		if(ret == 0)
		{
			net_service_sleep(10);
			++count;
			
			if(!net_connect(ns, "127.0.0.1", 9522))
			{
				// printf("connect error\n");
				fflush(stdout);
			}
			
			if(count % 100 == 0)
			{
				printf("-------------------------------- %d %d %d\n", net_socket_size(ns), msg_send_count, msg_recv_count);
				fflush(stdout);
			}
			continue;
		}


		for(i = 0; i < ret; ++i)
		{
			e = events[i].events;
			if(e & Eve_Error)
			{
				printf("socket error %d  %d\n", events[i].nd, e);
				fflush(stdout);
				net_socket_close(ns, events[i].nd, 0);
				continue;
			}


			if(e & Eve_Connect)
			{
				cfg.enByte = enByte16;
				cfg.read_buff_cnt = 8;
				cfg.write_buff_cnt = 8;
				cfg.pool = pool;

				if(net_socket_cfg(ns, events[i].nd, &cfg) < 0)
				{
					net_socket_close(ns, events[i].nd, 0);
				}
				else
				{
					// add a connect
					parm = 1;
					net_socket_ctl(ns, events[i].nd , &parm);
					sprintf(bf, " s %d do some read write op  %d %d\n", net_socket_size(ns), rand(), rand());
					if(net_socket_write(ns, events[i].nd, bf, strlen(bf) + 1) > 0)
					{
						++msg_send_count;
					}
				}
			}
			
			if(e & Eve_Read)
			{
				parm = net_socket_ctl(ns, events[i].nd, 0);
				if((rand() %  20480) <  ((int)parm / 256) )
				{
					net_socket_close(ns, events[i].nd, 1);
				}
				else
				{
					++parm;
					net_socket_ctl(ns, events[i].nd, &parm);
					handle_client_read(ns, events[i].nd);
				}
			}
		}
	}

	for(i = 0; i < (int)(sizeof(ts)/sizeof(ts[0])); ++i)
	{
		pthread_join(ts[i], &status);
	}
	net_close(ns);
	buff_pool_release(pool);
	return 0;
}