я могу ясно видеть, что recvbuf
имеет все данные, я ожидал еще select()
продолжает возвращающийся 1.Почему select() возвращает 1, но recv() возвращает 0?
Прямо сейчас он застрял в чистилище else if (iBuffer == 0) {}
.
SOCKET m_ConnectSocket;
/* The socket setup is done elsewhere but just adding this for clarity
This socket is responsible for sending from the client to the server
and also receives anything the server sends back.
This socket is doing the connect() & initial send()
*/
fd_set set;
struct timeval timeout;
// Set up the file descriptor set.
FD_ZERO(&set);
FD_SET(m_ConnectSocket, &set);
// Set up the struct timeval for the timeout.
timeout.tv_sec = RECV_DELAY_SEC;
timeout.tv_usec = RECV_DELAY_USEC;
int iBuffer = 0;
do
{
iResult = select(m_ConnectSocket, &set, NULL, NULL, &timeout);
if (iResult > 0)
{
iBuffer = recv(m_ConnectSocket, recvbuf, DEFAULT_BUFLEN, 0);
if (iBuffer > 0)
{
string sRecv(recvbuf);
STrace = String::Format("Bytes Received: {0}", iBuffer);
Trace(STrace, TRACE_INFO);
STrace = String::Format("Data Received: [{0}]", gcnew String(sRecv.c_str()));
Trace(STrace, TRACE_INFO);
}
else if (iBuffer == 0)
{
STrace = String::Format("iBuffer empty");
Trace(STrace, TRACE_INFO);
}
else
{
STrace = String::Format("recv failed: {0}", WSAGetLastError());
Trace(STrace, TRACE_ERROR);
}
}
else if (iResult == 0)
{
STrace = String::Format("No data left in buffer");
Trace(STrace, TRACE_INFO);
pMessage->Data(recvbuf);
if (iSentType != pMessage->Type())
{
STrace = String::Format("Message type mismatch: {0} | Expected: {1}", (int)pMessage->Type(), (int)iSentType);
Trace(STrace, TRACE_WARNING);
}
}
else if (iResult == -1)
{
STrace = String::Format("select() error");
Trace(STrace, TRACE_ERROR);
}
} while (iResult > 0);
Выбирает ли возвращение 1 первое или последующее время вокруг цикла? –
Это соединение UDP? Какова ценность DEFAULT_BUFLEN? Почему вы передаете 'm_connectSocket' для выбора вместо' 1'? (первым параметром select должно быть количество проверяемых файловых дескрипторов). – kfsone
AFAIR, первый аргумент 'select()' - это количество слотов в наборах, которые нужно зашить, а не число наибольшего дескриптора в них. Поэтому iff 'm_ConnectSocket' является наивысшим fd в наборах, я думаю, вы должны сделать' select (m_ConnectSocket + 1, ...) '. – Paulo1205