Проблема следующая получаю большой пакет данных отправленные функцией WSASend,задача отменить получение этого пакета.
Как варианты можно обрубить сокет(но это не подходит).Что надо сделать что бы socket сбросить в состояние игнора текущего пакета.
Ребята очень прошу помочь...
Re: Как отменить получение данных в асинхронном сокете
От:
Аноним
Дата:
15.02.05 13:35
Оценка:
Здравствуйте, _Lion, Вы писали:
_L>Проблема следующая получаю большой пакет данных отправленные функцией WSASend,задача отменить получение этого пакета. _L>Как варианты можно обрубить сокет(но это не подходит).Что надо сделать что бы socket сбросить в состояние игнора текущего пакета. _L>Ребята очень прошу помочь...
коротко — никак.
или закрывать сокет
или использовать протокол, допускающий прерывание передачи данных в пределах одной сессии
Re: Как отменить получение данных в асинхронном сокете
Здравствуйте, _Lion, Вы писали:
_L>Проблема следующая получаю большой пакет данных отправленные функцией WSASend,задача отменить получение этого пакета. _L>Как варианты можно обрубить сокет(но это не подходит).Что надо сделать что бы socket сбросить в состояние игнора текущего пакета. _L>Ребята очень прошу помочь...
Что значит отменить пакет? Какой пакет? TCP/UDP ? За один приём сокет можетпринять много пакетов, либо только чать большого фрагментированного. Как вариант прочитать содержимое сокета (recv()) и проигнорировать.
Re[2]: Как отменить получение данных в асинхронном сокете
Здравствуйте, sercher, Вы писали:
S>Здравствуйте, _Lion, Вы писали:
_L>>Проблема следующая получаю большой пакет данных отправленные функцией WSASend,задача отменить получение этого пакета. _L>>Как варианты можно обрубить сокет(но это не подходит).Что надо сделать что бы socket сбросить в состояние игнора текущего пакета. _L>>Ребята очень прошу помочь...
S> Что значит отменить пакет? Какой пакет? TCP/UDP ? За один приём сокет можетпринять много пакетов, либо только чать большого фрагментированного. Как вариант прочитать содержимое сокета (recv()) и проигнорировать.
Нет ребята закрывать не катит,принемать это извените трафик режит как будто ты все получил, так что предложенные варианты не подходят,а то что другое что то использовать привидите пример, я в частности использую winsocket2
Re[3]: Как отменить получение данных в асинхронном сокете
Здравствуйте, _Lion, Вы писали:
_L>Нет ребята закрывать не катит,принемать это извените трафик режит как будто ты все получил, так что предложенные варианты не подходят,а то что другое что то использовать привидите пример, я в частности использую winsocket2
Если уж твоя программа узнала про эти данные, то трафик вы уже получили, можете не беспокоится. Остаётся только считать и проигнорировать, либо закрыть сокет.
Нет ничего невозможного..
Re[4]: Как отменить получение данных в асинхронном сокете
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, _Lion, Вы писали:
_L>>Нет ребята закрывать не катит,принемать это извените трафик режит как будто ты все получил, так что предложенные варианты не подходят,а то что другое что то использовать привидите пример, я в частности использую winsocket2
B>Если уж твоя программа узнала про эти данные, то трафик вы уже получили, можете не беспокоится. Остаётся только считать и проигнорировать, либо закрыть сокет.
Я так понял, имеется ввиду на отправляющей стороне. Т.е. мы вызвали send() а потом передумали и надо отменить отсылку данных. Сомневаюсь, что в сокетах есть возможность очистить выходной буфер.
Re[5]: Как отменить получение данных в асинхронном сокете
Здравствуйте, sercher, Вы писали:
S>Здравствуйте, butcher, Вы писали:
B>>Здравствуйте, _Lion, Вы писали:
_L>>>Нет ребята закрывать не катит,принемать это извените трафик режит как будто ты все получил, так что предложенные варианты не подходят,а то что другое что то использовать привидите пример, я в частности использую winsocket2
B>>Если уж твоя программа узнала про эти данные, то трафик вы уже получили, можете не беспокоится. Остаётся только считать и проигнорировать, либо закрыть сокет.
S> Я так понял, имеется ввиду на отправляющей стороне. Т.е. мы вызвали send() а потом передумали и надо отменить отсылку данных. Сомневаюсь, что в сокетах есть возможность очистить выходной буфер.
Нет задача следующая: Пусть клиент скачивает с сервера по средствам socket некоторый большой кусок данных,он получил часть пакетов,знает что еще будет куча побольше и вдруг у него просыпается здравый смысл,а это дорого на какой я это качаю.Описываем техническую сторону вопроса: сервер с помощью команды WSASend отправил ассинхронно(тоесть не стал дожидатся полного отправления) большой пакет данных и забыл про них... Клиент в цикле проверяет состояние сокета и обрабатывает FD_READ... Он получил пару частей этого большого пакета из загаловка получил информацию о всем пакете...(прошу заметить сокет может читать и отсылать частями не превыщающий некоторый размер)... и теперь хочет отменить дальнейшее получение данных именно этого пакета...Тоесть необходимо что то вроде очистки сокета или посылки серверу сообщения что все получено успешно.Я вроде где то читал что можно перевести состояние сокета,тоесть сделать ShutDown([на получение,не помню ключ]),но при этом думаю он откажится получать всю очередь сообщения и это равносильно обрыву сокета вообще.Цель: прервать получение текушего сообщения,так что бы была возможна дальнейшая работа с сокетом и при этом затратить минимум трафика...
Вот теперь вроде все написал... Так что друзья, есть предложения???
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() нельзя отменить, уже если закрыл прием и/или передачу то это "навсегда"
Re[7]: Как отменить получение данных в асинхронном сокете
Здравствуйте, Аноним, Вы писали:
А>Еще раз, я уже отвечал ранее (самый первый ответ) — НЕЛЬЗЯ А>либо закрыть сокет, А>либо читать все что шлют, А>либо использовать протокол передачи (application layer) с возможностью отмены, такой протокол должен передавать данные порциями с подтверждением на продолжение передачи. из готовых мне на ум ничего не приходит кроме, пожалуй, TFTP, однако он базируется на UDP. Хотя идея там именно такая — клиент запрашивает данные, сервер передает блок и ждет ответ — либо продолжать либо прекратить. В самом TCP используется подобная схема, с окнами перегрузки, отложенными подтверждениями итп, но воздействовать на этот уровень из usermode нельзя. Возможно как-то и можно через WSAIOCtl с кодом SIO_FLUSH но мне кажется это стрельба из пушки по воробьям, тем более что опять-таки такую отмену должен поддерживать сервер (и протокол), а в этом случае проще воспользоваться чисто протокольными средствами. А>p.s. shutdown() нельзя отменить, уже если закрыл прием и/или передачу то это "навсегда"
И мне тогда совсем не понятен контекст использования функций:
WSACancelAsyncRequest
MSDN:The WSACancelAsyncRequest function cancels an incomplete asynchronous operation.
Хорошо расмотрим с другой стороны, допустим клиент отправил отмену серверу,как отменить текущую ассинхронную отправку данных по сокету,скажите это тоже не возможно?
Re[8]: Как отменить получение данных в асинхронном сокете
Здравствуйте, _Lion, Вы писали:
_L>И мне тогда совсем не понятен контекст использования функций: _L>WSACancelAsyncRequest _L>MSDN:The WSACancelAsyncRequest function cancels an incomplete asynchronous operation.
У этой функции другое назначение:
The WSACancelAsyncRequest function is used to cancel an asynchronous operation that was initiated by one of the WSAAsyncGetXByY functions such as WSAAsyncGetHostByName. The operation to be canceled is identified by the hAsyncTaskHandle parameter, which should be set to the asynchronous task handle as returned by the initiating WSAAsyncGetXByY function.
_L>Хорошо расмотрим с другой стороны, допустим клиент отправил отмену серверу,как отменить текущую ассинхронную отправку данных по сокету,скажите это тоже не возможно?
Если вы пользуется для отправки OVERLAPPED I/O, то возможно вам мпоможет CancelIo(). Но опять же, если учесть:
Пусть клиент скачивает с сервера по средствам socket некоторый большой кусок данных,он получил часть пакетов,знает что еще будет куча побольше и вдруг у него просыпается здравый смысл,а это дорого на какой я это качаю.
, то не проще ли сразу shutdown(sock, SD_RECV) и всё?
Нет ничего невозможного..
Re[6]: Как отменить получение данных в асинхронном сокете
Здравствуйте, _Lion, Вы писали:
_L>ShutDown([на получение,не помню ключ]),но при этом думаю он откажится получать всю очередь сообщения и это равносильно обрыву сокета вообще.Цель: прервать получение текушего сообщения,так что бы была возможна дальнейшая работа с сокетом и при этом затратить минимум трафика... _L>Вот теперь вроде все написал... Так что друзья, есть предложения???
Посмотрите на реализацию протокола FTP, думаю он вам подойдёт, хотя бы принцип работы.