Linux处理多个socket 简单的来说有两种方式。1,每个socket 用一个线程来处理,有多少socket就创建立多少线程。2,在单个线程或主程序中使用 Select 函数,处理多个socket。
方式1适用于内存大,socket连接数量不多的情况。Linux 系统每创建一个线程就要默认分配8M大小的栈空间。线程过多会很吃内存。但是这种处理方式比较简单,并发性较强。
方式2 省内存。基本原理就是把已经建立的socket连接加入到 Select的监控中。select函数会阻塞,如果监控到某些socket 可读或可写,那么select 函数返回正值,接下来recv或send就可以了。
伪代码:
while(1)
{
fd_set fdsr;
FD_ZERO(&fsdr ); // 清空某个列表。
FD_SET(sockid, &fdsr); // 把某个socket 加入到监控中
ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv ); // 阻塞
if(ret < 0)
{
break; // 退出
}
else
{
countinue; // 继续下一次循环
}
if (FD_ISSET(sockid, &fdsr)) // 测试某个socket 是否在监控列表中
{
ret = recv(fd_A[i], buf, sizeof(buf), 0);
}
}
参数 maxsock : 监控socket集合的最大值,比如说有4个sock分别说 1,2,3,4 那么Maxsock = 4;
参数fdsr: socket集合
参数 tv: 函数阻塞时间。