我有選擇功能的一些問題,我寫了這個代碼:選擇 - 幾個問題
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是套接字的最大數量,但此代碼在沒有此參數的情況下工作。
下一個問題是,爲什麼選擇需要超時?當我不給這個參數時,選擇標記所有套接字爲可讀的套接字,但在套接字沒有任何數據讀取時選擇這樣做。當我給這個arg我沒有這個問題。但爲什麼 ?
如果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];
}
Windows'select()'的執行忽略了第一個參數。這在['select()'文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141.aspx)中有很多說明。 –