Мне интересно, если есть способ очистить внутренний буфер оконного сокета, потому что я хочу добиться, это
while(1){
for(i=0;i<10;i++){
sendto(...) //send 10 UDP datagrams
}
for(i=0;i<10;i++){
recvfrom (Socket, RecBuf, MAX_PKT_SIZE, 0,
(SOCKADDR*) NULL, NULL);
int Status = ProcessBuffer(RecBuf);
if (Status == SomeCondition)
MagicalSocketCleanUP(Socket); //clean up the rest of stuff in the socket, so that it doesn't effect the reading for next iteration of the outer while loop
break; //occasionally the the receive loop needs to terminate before finishing off all 10 iteration
}
}
поэтому я спрашиваю, есть ли функция для очистки всего, что осталось в сокете, чтобы оно не повлияло на мое следующее чтение? Спасибо
Способ очистки данных из внутреннего буфера приемного сокета заключается в чтении данных до тех пор, пока не останется больше данных для чтения. Если вы делаете это неблокирующим образом, вам не нужно ждать больше данных в select()
, поскольку EWOUDBLOCK
значение ошибки означает, что внутренний буфер приемного сокета пуст.
int MagicalSocketCleanUP(SOCKET Socket) {
int r;
std::vector<char> buf(128*1024);
do {
r = recv(Socket, &buf[0], buf.size(), MSG_DONTWAIT);
if (r < 0 && errno == EINTR) continue;
} while (r > 0);
if (r < 0 && errno != EWOULDBLOCK) {
perror(__func__);
//... code to handle unexpected error
}
return r;
}
Но это не совсем безопасно. Другой конец сокета, возможно, тоже отправил хорошие данные в буфер сокета, поэтому эта процедура может отбрасывать больше, чем вы хотите отбросить.
Вместо этого данные на сокете должны быть оформлены таким образом, чтобы вы знали, когда поступают данные, представляющие интерес. Таким образом, вместо API очистки вы можете расширить ProcessBuffer()
отменить ввод, пока он не найдет данные, представляющие интерес.
Более простым механизмом будет обмен сообщениями между двумя сторонами сокета. Когда состояние ошибки введено, отправитель отправляет сообщение «ОТМЕНА ДО <TOKEN>
«сообщение. Получатель отправляет обратно»<TOKEN>
«и знает, что только данные после»<TOKEN>
«сообщение будет обработано.<TOKEN>
«может быть случайной последовательностью.
Других решений пока нет …