Re[6]: Как отменить получение данных в асинхронном сокете
От:
Аноним
Дата:
16.02.05 12:22
Оценка:
Здравствуйте, _Lion, Вы писали:
_L>Здравствуйте, sercher, Вы писали:
S>>Здравствуйте, butcher, Вы писали:
B>>>Здравствуйте, _Lion, Вы писали:
_L>>>>Нет ребята закрывать не катит,принемать это извените трафик режит как будто ты все получил, так что предложенные варианты не подходят,а то что другое что то использовать привидите пример, я в частности использую winsocket2
B>>>Если уж твоя программа узнала про эти данные, то трафик вы уже получили, можете не беспокоится. Остаётся только считать и проигнорировать, либо закрыть сокет.
S>> Я так понял, имеется ввиду на отправляющей стороне. Т.е. мы вызвали send() а потом передумали и надо отменить отсылку данных. Сомневаюсь, что в сокетах есть возможность очистить выходной буфер. _L>Нет задача следующая: Пусть клиент скачивает с сервера по средствам socket некоторый большой кусок данных,он получил часть пакетов,знает что еще будет куча побольше и вдруг у него просыпается здравый смысл,а это дорого на какой я это качаю.Описываем техническую сторону вопроса: сервер с помощью команды WSASend отправил ассинхронно(тоесть не стал дожидатся полного отправления) большой пакет данных и забыл про них... Клиент в цикле проверяет состояние сокета и обрабатывает FD_READ... Он получил пару частей этого большого пакета из загаловка получил информацию о всем пакете...(прошу заметить сокет может читать и отсылать частями не превыщающий некоторый размер)... и теперь хочет отменить дальнейшее получение данных именно этого пакета...Тоесть необходимо что то вроде очистки сокета или посылки серверу сообщения что все получено успешно.Я вроде где то читал что можно перевести состояние сокета,тоесть сделать ShutDown([на получение,не помню ключ]),но при этом думаю он откажится получать всю очередь сообщения и это равносильно обрыву сокета вообще.Цель: прервать получение текушего сообщения,так что бы была возможна дальнейшая работа с сокетом и при этом затратить минимум трафика... _L>Вот теперь вроде все написал... Так что друзья, есть предложения???
Еще раз, я уже отвечал ранее (самый первый ответ) — НЕЛЬЗЯ
либо закрыть сокет,
либо читать все что шлют,
либо использовать протокол передачи (application layer) с возможностью отмены, такой протокол должен передавать данные порциями с подтверждением на продолжение передачи. из готовых мне на ум ничего не приходит кроме, пожалуй, TFTP, однако он базируется на UDP. Хотя идея там именно такая — клиент запрашивает данные, сервер передает блок и ждет ответ — либо продолжать либо прекратить. В самом TCP используется подобная схема, с окнами перегрузки, отложенными подтверждениями итп, но воздействовать на этот уровень из usermode нельзя. Возможно как-то и можно через WSAIOCtl с кодом SIO_FLUSH но мне кажется это стрельба из пушки по воробьям, тем более что опять-таки такую отмену должен поддерживать сервер (и протокол), а в этом случае проще воспользоваться чисто протокольными средствами.
p.s. shutdown() нельзя отменить, уже если закрыл прием и/или передачу то это "навсегда"