Closed cyanray closed 3 years ago
select 模型的特点,socket 的值不能大于1024。 否则 FD_SET 宏会溢出,导致 Segmentation fault。
FD_SET
最近出现了奇怪的现象,Websocket 库中的 wsSocket 成员(用于保存 Websocket 的套接字),它的值会在运行一段时间后,莫名其妙地被修改。然后又被自动修改回来(这是最诡异的)。使用以下代码检测,发现它的值变为了 1432497648。由于超出了 1024 的大小,所以会导致 Segmentation fault。
1432497648
if (sock <= 0 || sock >= 1023) { cout << "invalid sock: " << (int)(sock) << endl; continue; } FD_SET(sock, &fds_read);
mirai-cpp 版本:master 分支 操作系统: Debian 4.19.146-1 (2020-09-17) x86_64 GNU/Linux
由于无法解释这个修改是如何发生的,只能暂时在执行 FD_SET(sock, &fds_read); 前对 sock 的值进行检测,确保 sock 的值在范围内。
FD_SET(sock, &fds_read);
https://github.com/cyanray/mirai-cpp/blob/master/include/mirai/third-party/WebSocketClient.cpp#L340
破案,这一行多了个引号。
bug fixed.
select 模型的特点,socket 的值不能大于1024。 否则
FD_SET
宏会溢出,导致 Segmentation fault。最近出现了奇怪的现象,Websocket 库中的 wsSocket 成员(用于保存 Websocket 的套接字),它的值会在运行一段时间后,莫名其妙地被修改。然后又被自动修改回来(这是最诡异的)。使用以下代码检测,发现它的值变为了
1432497648
。由于超出了 1024 的大小,所以会导致 Segmentation fault。mirai-cpp 版本:master 分支 操作系统: Debian 4.19.146-1 (2020-09-17) x86_64 GNU/Linux
由于无法解释这个修改是如何发生的,只能暂时在执行
FD_SET(sock, &fds_read);
前对 sock 的值进行检测,确保 sock 的值在范围内。