madeye:test_event 失败由 macOS 文件描述符上限引起

Thanks for the report. This is caused by macOS's default per-process file descriptor limit rather than a bug in the event loop. `test_event` deliberately opens 256 UDP sockets (to exceed Winsock's 64-descriptor `select()` limit) plus a sender socket and the loop's own kqueue descriptor. A stock macOS Terminal session starts with a soft limit of 256 (`ulimit -n` prints `256`), so `socket()` starts returning -1 near the end of that loop and the unchecked descriptor trips the `bind()` assertion you saw. Running with a higher limit already makes the test pass on 3.3.6: ```sh ulimit -n 1024 ctest --test-dir build -L 'unit|vendor' --output-on-failure ``` (节选)

作者原文

Thanks for the report. This is caused by macOS's default per-process file descriptor limit rather than a bug in the event loop.

test_event deliberately opens 256 UDP sockets (to exceed Winsock's 64-descriptor select() limit) plus a sender socket and the loop's own kqueue descriptor. A stock macOS Terminal session starts with a soft limit of 256 (ulimit -n prints 256), so socket() starts returning -1 near the end of that loop and the unchecked descriptor trips the bind() assertion you saw. Running with a higher limit already makes the test pass on 3.3.6:

ulimit -n 1024
ctest --test-dir build -L 'unit|vendor' --output-on-failure

https://github.com/shadowsocks/shadowsocks-c/pull/3060 fixes this properly: CTest now raises the soft limit to 1024 before launching each unit test, test_event raises its own limit when run directly, and a socket() failure is now reported as such instead of as a bind() failure.