目的: 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为下标。
本文目的是分析windows, linux下 socket的 分配算法,验证以上做法是否安全。
测试语句:
SOCKET new_sd = :: socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
硬件环境: x86
windows:
![](https://i-blog.csdnimg.cn/blog_migrate/02e63dffdd858c1d8c6178ab9166a7f9.png)
从某个值(每次都不固定)开始递减4,一直到最小值。又开始从某个值递增4,一直到返回-1.
WSAGetLastError为WSAENOBUFS(10055) : 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
结论: 能分配的 socket远远大于65536且不连续,假设最大连接数65536时,分配的 socket肯定远大于65536(递增4)
所以不能用一个静态大数组,以 socket为下标来存储。
linux:
![](https://i-blog.csdnimg.cn/blog_migrate/02e63dffdd858c1d8c6178ab9166a7f9.png)
socket在linux是文件描述符的一种。每个进程文件描述符数量是有限制的。 ulimit -n可以查看当前进程能使用的最大文件描述符数量。一般是1024.
去掉0,1,2,从3开始分配 socket描述符,递增1,所以可以用大数组,以 socket为下标。