Android 平台为什么要把在socket fd 大于1024的时候 close socket?

[Image Removed]

我看这个是2018年的一个提交,以前一直没有问题的,现在突然碰到了,我这个手机也没更新Android操作系统

我加了日志

[2025.06.05-14.47.53:645][ 37412]LogSockets: Display: |SocketSubsystemBSD.cpp:54|CreateSocket, SocketType: DGram, SocketDesc: Unreal, ProtocolType: IPv4, Scoket:4385

[2025.06.05-14.47.53:645][ 37412]LogSockets: Display: |SocketSubsystemBSD.cpp:62|CreateSocket close socket

socket 是4385

重现步骤
有个手机现在能必现

您好,这个应该是早期socket使用select的时候添加的FD_SET最大只支持1024,后来22年的时候,应该是换成poll了

在最新的引擎(5.6)中这个限制已经移除了​

切换 poll 的提交在这里 https://github.com/EpicGames/UnrealEngine/commit/c0f3b15a82f3eac5fc55dcb58cb687fa1d1cd1f4

5.6引擎如果打的Android包装在老的Android客户端那岂不是还是会有问题

这里是指引擎的实现,不是系统的实现

哦哦,那就是引擎中FSocketBSD::HasState这个接口以前是用select实现的,所以以前创建socket的地方就限制了得小于1024吗? 不是Android操作系统的限制?

对的

但1024是系统的限制,由于不用select了,也就没有这个限制了​

那还是select本身有1024的限制,不是Android有这个限制? 为什么iOS,Linux上没这个限制

理论上BSD内核的使用select都有上限,包括 ios 和 linux

在android下 ndk中, indlue/sys/select.h

#define FD_SETSIZE 1024

而linux和ios我没有去查看,不过应该也是这个值,只是之前发生过错误 所以没加上这个限制

嗯,linux和iOS也都是使用的是FScoketBSD::HasState 这个函数,应该是都会有问题的。 如果不是Android操作系统的限制,仅仅是select的限制的话。那我可以把5.6中的修改合过来了