Отменить в ожидании recv?

0

Привет, я работаю над сетевым проектом. У меня есть сокет, который прослушивает входящие данные. Теперь я хочу архивировать это: Socket получит только 100 пакетов. И есть 3-4 клиента. Они отправляют пакеты случайных данных бесконечно. Я получу 100 пакетов, а позже я их обработаю. После процесса я снова начну получать. Но в это время есть некоторые ожидающие операции send() >> recv(). Теперь я хочу отменить/отменить ожидающие операции recv. Я думаю, мы найдем данные, и мы их не обработаем. Любые другие предложения? (извините за плохой состав вопроса)

Теги:
networking
sockets

2 ответа

3
Лучший ответ

Выключите и закройте соединение. Это немедленно отменит все.

Еще лучше, заново создайте приложение и сетевой протокол, чтобы вы могли достоверно рассказать, сколько данных получить.

В Windows вы можете отменить выдающиеся результаты с помощью CancelIO, но это может привести к утере данных, если только что-то получилось, чтобы что-то прочитать.

  • 0
    Обратитесь к msdn.microsoft.com/en-us/library/windows/desktop/… для объяснения того, как работает выключение сокета. Информация там 90% кроссплатформенная и 10% специфичная для Windows.
  • 0
    Это почти правильно, за исключением того, что в Unix вам придется делать это: signal (SIGPIPE, SIG_IGN); поскольку закрытие сокета во время ожидания другого потока приводит к разрыву канала.
1

Вы можете использовать циклы select() или poll(). вы можете использовать сигнал. recv() вернется к приему сигнала, чтобы вы могли отправить сигнал от другой задачи к задаче, которая блокирует recv(). Но вы должны убедиться, что вы не указали SA_RESTART (см http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)

Подробнее см. Http://en.wikipedia.org/wiki/Asynchronous_I/O

Ещё вопросы

Сообщество Overcoder
Наверх
Меню