我有几个关于选择功能的问题,我写了这段代码:
void TCPSerwer::sel()
{
struct timeval tv = {1, 0};
fd_set temp_list = m_RecvList;
//if(select(m_fdmax + 1, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
if(select(0, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
{
perror( "select" );
exit( 1 );
}
for(int i = 0; i <= m_fdmax; i++ )
{
if(FD_ISSET(i, &temp_list))
{
// New connection
if(i == m_ListenSocket)
{
acceptClient();
}
// Data from client
else
{
PacketHeader header;
int nbytes = recv(i, (char*)(&header), sizeof(PacketHeader),
// Error
if(nbytes < 0)
{
disconnectClient(i);
}
// success
else
{
std::cout << "type: " << header.type << " len: " << header.length << std::endl;
}
}
}
}
}
我可以给第一个参数来选择函数,但我不能这样做,但是为什么呢?为什么 a 应该给第一个 arg 来选择?m_fdmax 是最大数量的套接字,但此代码在没有此参数的情况下工作。
下一个问题是,为什么选择需要超时?当我不提供此参数时,选择将所有套接字标记为可读的套接字,但在套接字没有任何数据可读取时选择执行此操作。当我给这个参数时,我没有这个问题。但为什么 ?
如果 m_fdmax 是最大的套接字数,我必须在关闭连接时找到下一个最大的套接字数,对吗?我应该这样做:
int size = m_ClientVector.size();
for(int i = 0; i < size; i++)
{
if(m_ClientVector[i] > m_fdmax)
m_fdmax = m_ClientVector[i];
}