Выполнение функции select() (строка 13 предоставленного кода) возвращает ошибку 10022 (WSAEINVAL), означающую, что либо моя переменная тайм-аута имеет отрицательное значение, либо все 3 другие переменные имеют значение NULL. Но я получаю эту ошибку только после первой итерации внешнего цикла.
По сути, моя настройка заключается в отправке окна пакетов размера N в базу, затем проверьте, были ли отправлены мне какие-либо подтверждения, проверив, готов ли мой сокет для чтения. Для первого окна пакетов вызов select() работает просто отлично, возвращая 1. Но все вызовы select() после первой итерации полного цикла приводят к коду ошибки. У меня совсем нет идей.
Я видел поток, в котором говорилось, что нужно просто обернуть функцию другим вызовом функции, и это, похоже, не изменило проблему. Я понятия не имею, почему это сработает в первом цикле, но не после этого.
int Exit = 0;
int endRecv = 0;
int ready = 0;
//Sending Algorithm
int base = 0;
uint32_t confirmedPosition;
while (Exit == 0) {
//Send data in an N sized Window.
for (int i = 0; i < N; i++) {
if (successfulPackets[i + base] != 1) {
memcpy(&buffer_tx, &packets[i + base], BUFFERS_LEN);
sendto(socketS, buffer_tx, BUFFERS_LEN, 0, (sockaddr*)& addrDest, sizeof(addrDest));
}
}
endRecv = 0;
//Receive Confirmations
while (endRecv == 0) {
//Poll to see if something is waiting
ready = select(NULL, &readfds, NULL, NULL, &pollTime);
if (ready == -1) {
printf("Error with Code: %d", WSAGetLastError());
} else if (ready == 1) {//If yes, log confirmation
recvfrom(socketS, buffer_rx, BUFFERS_LEN, 0, (sockaddr *)&from, &fromlen);
memcpy(&confirmedPosition, &buffer_rx, 4);
successfulPackets[confirmedPosition] = 1;
fileSize -= BUFFERS_LEN - 8;
} else {//If no, end receiving and send
endRecv = 1;
}
}
//Apply Changes to Base
for (int i = 0; i < N; i++) {
if (successfulPackets[base] == 1) {
base++;
}
}
if (fileSize <= 0) {
Exit = 1;
}
}
Когда select возвращает 0, содержимое структуры readfds также устанавливается равным нулю (выбор изменяет его, чтобы указать, какой сокет готов).
Когда внешний цикл выполняется снова, структура readfds не содержит ни одного сокета для проверки, что вызывает ошибку. Вы должны снова установить сокет в readfds.
Это исправило это. Я переместил функцию FD_SET внутрь цикла, и она работает. Спасибо!