Wednesday, April 30, 2008

Asio实现线程池绑定多个socket对外部进行响应

主要用到几个基本的步骤
1,你要让很多个socket绑定在多个端口上
service.sin_family = AF_INET;
service.sin_addr.s_addr = htonl(INADDR_ANY);
for (int i = 0; i< svnodes_num;) {
g_bindsocks[i] = socket( AF_INET, SOCK_DGRAM, 0);
if ((g_bindsocks[i]) < 0)
return false;
service.sin_port = htons(nextport);
if (bind(g_bindsocks[i], (sockaddr*) &service, sizeof(service))>=0) {
fcntl(g_bindsocks[i], F_SETOWN, getpid());
ioctl(g_bindsocks[i], FIOASYNC, &on);
ioctl(g_bindsocks[i], FIONBIO, &on);
g_bindsocks_ports[i] = nextport;
i ++;
} else {
close(g_bindsocks[i]);
}
nextport++;
if (nextport >=0x10000)
return false;
}
2,你要忽略所有的sigio信号同时跑起asio的udp多线程的server端
void* dg_echo(void* param)
{
signal(SIGIO, SIG_IGN); //忽略所有的sigio信号
AsioFrame(); //Use the asioframe to handle this
}
3,udp_server的代码在asio的tutorial里面
我现在把怎样绑定写出来
void AsioFrame() {
try
{
#ifdef DEBUG
std::cout<<"asioframe run!"< #endif
boost::asio::io_service io_service;
uint32 numsocks = Util::GetNumOfVirtualNodes();
int* sockptr = (int *)Util::GetBindSocksPtr();
udp_server* serverpool[100];
if (numsocks> 100)
numsocks = 100;
for (uint32 id = 0; id < numsocks; id ++)
{
serverpool[id] = new udp_server(io_service, id, sockptr[id]);
}
io_service.run();

/*for (uint32 id = 0; id < numsocks; id ++)
{
delete serverpool[id];
}*/
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}

No comments: