Я пишу программу чата, и моя функция приема иногда вообще не ждет .. Вот код получения: важные части - это в основном первая половина, но я добавил всю функцию на всякий случай. (Правка: комментирование для меня, а не для чтения, ребята, вы читаете! Извините!)
ReceiveStatus Server::Receive(PacketInternal*& packetInternalOut)
{
fd_set fds ;
int n ;
struct timeval tv ;
// Set up the file descriptor set.
FD_ZERO(&fds) ;
FD_SET(*p_socket, &fds) ;
// Set up the struct timeval for the timeout.
tv.tv_sec = NETWORKTIMEOUTSEC ;
tv.tv_usec = NETWORKTIMEOUTUSEC ;
// Wait until timeout or data received.
n = select ( *p_socket, &fds, NULL, NULL, &tv ) ;
if ( n == 0)
{
return ReceiveStatus::ReceiveTimeout;
}
else if( n == -1 )
{
return ReceiveStatus::ReceiveSocketError;
}
//need to make this more flexible so it can support others
sockaddr_in fromAddr;
int flags = 0;
int fromLength = sizeof(fromAddr);
char dataIn[TOTALPACKETSIZE];
int bytesIn = recvfrom(*p_socket, dataIn, TOTALPACKETSIZE, flags, (SOCKADDR*)&fromAddr, &fromLength);
// Convert fromAddr into ip, port
if(bytesIn == SOCKET_ERROR)
{
return ReceiveStatus::ReceiveSocketError;
}
if(bytesIn > 0)
{
memcpy(packetInternalOut,dataIn,bytesIn);
return ReceiveStatus::ReceiveSuccessful;
}
else
{
return ReceiveStatus::ReceiveEmpty;
}
}
Есть ли что-то, что может повлиять на то, работает это или нет? моя программа чата может быть либо сервером, либо клиентом. они оба используют один и тот же код. Сервер в ожидании соединения сидит в Select () в течение 100 секунд, так как NETWORKTIMEOUTSEC = 100. Но в программе char, когда я хочу отправить сообщение, я сначала отправляю запрос на передачу, а затем жду Подтверждение (для пакета подтверждения мне нужно снова позвонить и получить). Теперь это шаг, который не ждет . моя функция ReceiveAck вызывает функцию Receive (), а прием выполняется прямо по всему коду. Я могу проверить это, создав клиент, а не сервер. Если я отправляю сообщение, где нет сервера, он должен подождать 100 секунд для подтверждения, а затем время ожидания. Но вместо этого, как только я нажимаю ввод, он говорит, что время истекло.
Я не могу понять, что заставило бы его пропустить этот шаг. Я отлаживал свою программу чата как в состоянии сервера, так и в состоянии клиента. Значения tv и fds одинаковы для обоих, но сервер будет ждать, а клиент не будет ...