【发布时间】:2021-11-15 03:24:21
【问题描述】:
#define RETRY_TIMEOUT 2
while(1)
{
read_size = SocketReceive(hSocket, recvBuf, sizeof(recvBuf),
rsHndl, RETRY_TIMEOUT);
}
int SocketReceive(int hSocket,uint8_t* Rsp,short RvcSize, EMHANDLE *rsHndl,
unsigned short timeout)
{
struct pollfd fds[1];
int rv = -1;
fds[0].fd = hSocket;
fds[0].events = POLLIN;
if ((rv = poll(fds, 1, timeout * 1000) > 0))
{
if (fds[0].revents & POLLIN)
{
shortRetval = recv(hSocket, Rsp, RvcSize, 0);
}
}
}
这是客户端代码。当我用我的服务器(能够处理 250 个客户端)测试 10 个客户端时,这段代码运行良好,没有任何问题。当我尝试使用 250 个客户端时,轮询在客户端挂起。这是代码的简化版
【问题讨论】:
-
请不要提供简化版本,除非它可以清楚地用于重现问题。这里的一个简单解释是那里没有数据,因此 poll 不会报告任何要读取的数据。这意味着人们不仅需要此代码片段,还需要发生问题的实际代码以及有关如何运行代码以使问题发生的足够信息。见How to create a Minimal, Reproducible Example。
-
您有任何理由认为问题出在客户端吗?听起来这很可能是您的服务器出了问题,而且您还没有向我们展示任何服务器代码。