这是我在这个网站上的第一个问题,在我的 C++ 编码中多次使用它来帮助我。
我只是问,因为我碰壁了,只是不明白发生了什么,并认为这是一个很好的小谜,有人来解决。
我有一个客户端/服务器架构,有 1 个服务器和多个客户端。
下面的代码片段工作正常,除了阻塞的唯一套接字是 mList 中的最后一个,因此如果连接了 2 个客户端,则只有第二个要连接的客户端接收数据。这段代码不是我自己的,我正在尝试调试移动 if 语句时发生的分段错误。
int SocketManager::block(int secs, int usecs)
{
int ret = 0;
int result = 0;
struct timeval tv;
fd_set set;
int max_sd = 0;
if (mList.empty())
{
return -1;
}
tv.tv_sec = secs;
tv.tv_usec = usecs;
FD_ZERO(&set);
SocketList::const_iterator iter;
int n = 0;
for (iter = mList.begin(); iter != mList.end(); iter++)
{
if ((*iter)->socket() > max_sd)
{
max_sd = (*iter)->socket();
}
FD_SET((*iter)->socket(), &set);
n++;
}
errno = 0;
if ((result = select(max_sd + 1, &set, NULL, NULL, &tv)) > 0)
{
ret = 1;
Socket *s = NULL;
for (iter = mList.begin(); iter != mList.end(); iter++)
{
if (FD_ISSET((*iter)->socket(), &set))
{
s = (*iter);
}
}
if (s)
{
mLastSocketPtr = s;
s->checkForData();
mLastSocketPtr = NULL;
}
}
else if (result == 0)
{
// Timeout
ret = 0;
}
else
{
// Error
ret = -1;
}
return ret;
}
问题出现在“if (FD_ISSET((*iter)->socket(), &set))”这一行,当 if 语句
if (s)
{
mLastSocketPtr = s;
s->checkForData();
mLastSocketPtr = NULL;
}
像这样在 FD_ISSET 函数内部移动
for (iter = mList.begin(); iter != mList.end(); iter++)
{
if (FD_ISSET((*iter)->socket(), &set))
{
s = (*iter);
if (s)
{
mLastSocketPtr = s;
s->checkForData();
mLastSocketPtr = NULL;
}
}
}
有什么帮助吗?