linux下socket的分配算法

来源:互联网 发布:unity3d门动画怎么做 编辑:程序博客网 时间:2024/05/21 00:18
目的: linux服务端开发有一种常用做法,是定义一个大数组存放所有玩家信息,大小为65536,以socket为下标存储玩家信息,理由是linux下socket描述符的分配是递增1的,而端口号为16位,最大为65536,即一台物理机最多能接受65536个连接。所以用一个65536的大数组来存放所有玩家是安全的。
本文目的是分析windows, linux下socket分配算法,验证以上做法是否安全。

测试语句:
SOCKET new_sd = ::socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
硬件环境: x86

windows:
test.rar
从某个值(每次都不固定)开始递减4,一直到最小值。又开始从某个值递增4,一直到返回-1.
WSAGetLastError为WSAENOBUFS(10055) : 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
结论: 能分配的socket远远大于65536且不连续,假设最大连接数65536时,分配的socket肯定远大于65536(递增4)
所以不能用一个静态大数组,以socket为下标来存储。








linux:
test.rar
socket在linux是文件描述符的一种。每个进程文件描述符数量是有限制的。 ulimit -n可以查看当前进程能使用的最大文件描述符数量。一般是1024.
去掉0,1,2,从3开始分配socket描述符,递增1,所以可以用大数组,以socket为下标。