1. Операция завершиться, когда будет отправлен весь буффер (например 1М)?
2. Если у меня на порту завершения несколько отложенных операций,
и клиент отсоединяется, как мне потом удалить все overlapplus связанные,
с данным сокетом.
__A>Добрый день. Есть недопонимание с IOCompletionPort.
__A> overlapplus = new ... __A> overlapplus->type = send;
__A> WSABUF buf; __A> buf.buf = buffer; __A> buf.len = BUFF_SIZE; __A> WSASend(op->sock_handle, &buf, 1, &b, &flags, overlapplus, 0);
__A>1. Операция завершиться, когда будет отправлен весь буффер (например 1М)? __A>2. Если у меня на порту завершения несколько отложенных операций, __A> и клиент отсоединяется, как мне потом удалить все overlapplus связанные, __A> с данным сокетом.
__A>Аналогично и для WSARecv.
__A>Буду очень благодарен за ответ.
WSASend завершится сразу, в порт придет событие по завершении операции или ошибке,
также если клиент отсоединится то все отложенные/незавершенные запросы сразу придут в порт с кодом ошибки
Здравствуйте, NeuroVirus, Вы писали:
NV>WSASend завершится сразу, в порт придет событие по завершении операции или ошибке,
Мена как раз вот это момент интересует, придет событие когда ПОЛНОСТЬЮ отправлены
или приняты данные, т.е. именно то количество, которое я указал в WSABUFF.len?
Здравствуйте, __AK__, Вы писали:
__A>Здравствуйте, NeuroVirus, Вы писали:
NV>>WSASend завершится сразу, в порт придет событие по завершении операции или ошибке,
__A>Мена как раз вот это момент интересует, придет событие когда ПОЛНОСТЬЮ отправлены __A>или приняты данные, т.е. именно то количество, которое я указал в WSABUFF.len?
__A>Или придется делать так.
__A>TotalSize = 1024 __A>Current = 0
__A>WSABUF buf; __A>buf.buffer = pBuffer; __A>buf.len = TotalSize;
__A>WSASend(...,&buf...);
__A>.........
__A>GetQueuedCompletionStatus(..., &NumberOfBytes, )
__A>Current += NumberOfBytes; __A>if (Current < TotalSize) __A>{ __A> WSABUF buf; __A> buf.buffer = pBuffer + Current; __A> buf.len = TotalSize — Current; __A> WSASend(..., &buf,...) __A>}
__A>Аналогично интересует и для WSARecv.
когда послано именно все, по крайней мере в моей практике .
а вот принято может быть меньше чем размер буфера
NV>когда послано именно все, по крайней мере в моей практике . NV>а вот принято может быть меньше чем размер буфера
О! Это оличная новость, т.е. можно пачку WSASend накидать, и голову не греть.
Тогда еще вопрос, а если у тебя после GetComplitionStatus, отправленное
количество с тем что вернул GetComplitionStatus различается, что делать
отрубать киента?
NV>>когда послано именно все, по крайней мере в моей практике . NV>>а вот принято может быть меньше чем размер буфера
__A>О! Это оличная новость, т.е. можно пачку WSASend накидать, и голову не греть. __A>Тогда еще вопрос, а если у тебя после GetComplitionStatus, отправленное __A>количество с тем что вернул GetComplitionStatus различается, что делать __A>отрубать киента?
скорее всего такая ситуация будет вместе с кодом фатальной ошибки,
а в таком случае я отрубаю полюбому. но! сделайте свой сервер и стресс-тестер к нему и проверте
NV>скорее всего такая ситуация будет вместе с кодом фатальной ошибки, NV>а в таком случае я отрубаю полюбому. но! сделайте свой сервер и стресс-тестер к нему и проверте
Ну это в любом случае. 8)
И еще, если не затруднит, один маленький лекбез.
Если у меня в очереди на завершение, например, 3 WSASend и 1 WSARecv. То если,
клиент разорвал соединение, по идее, в данном случае 4 раза сработает GetComplitionStatus.
(Я правильно понимаю) и для каждогй операции вернет количество байт = 0.
В какой момент очишать память связанную с контекстом пользователя, который разорвал соединение?
Как удостовериться, что все операции с данным пользователем завершены?
(Или, например, на каждую отложенную оперецию для контекста пользователя
делать AddRef, а после завершения Release? (есть общепринятая практика?))
Здравствуйте, __AK__, Вы писали:
NV>>скорее всего такая ситуация будет вместе с кодом фатальной ошибки, NV>>а в таком случае я отрубаю полюбому. но! сделайте свой сервер и стресс-тестер к нему и проверте
__A>Ну это в любом случае. 8) __A>И еще, если не затруднит, один маленький лекбез. __A>Если у меня в очереди на завершение, например, 3 WSASend и 1 WSARecv. То если, __A>клиент разорвал соединение, по идее, в данном случае 4 раза сработает GetComplitionStatus. __A>(Я правильно понимаю) и для каждогй операции вернет количество байт = 0. __A>В какой момент очишать память связанную с контекстом пользователя, который разорвал соединение? __A>Как удостовериться, что все операции с данным пользователем завершены? __A>(Или, например, на каждую отложенную оперецию для контекста пользователя __A>делать AddRef, а после завершения Release? (есть общепринятая практика?))
по разному можно.
1) как вы сами и сказали — подсчет "ссылок", тут главное сделать все аккуратно, чтоб не сбится со счета,
однажды я стал получать ошибки отличные от PENDING но пакеты уходили в порт, у меня счет сбился,
я не стал искать причину и сделал подругому, а именно
2) список клиентов, каждый клиент имеет уникальный номер типа послед. счетчика или GUID-а (не адрес!),
список индексирован по этому ключу, в структуре для WSASend/WSARecv есть поле для этого ключа,
при первом ошибочном пакете из порта я убиваю клиента и убираю его из списка, остальные пакеты
просто не находят своего адресата.
в моей реализации это оказалось кстати ибо такой список клиентов у меня все равно уже поддерживался.
NV> по разному можно. NV>1) как вы сами и сказали — подсчет "ссылок", тут главное сделать все аккуратно, чтоб не сбится со счета, NV>однажды я стал получать ошибки отличные от PENDING но пакеты уходили в порт, у меня счет сбился, NV>я не стал искать причину и сделал подругому, а именно NV>2) список клиентов, каждый клиент имеет уникальный номер типа послед. счетчика или GUID-а (не адрес!), NV>список индексирован по этому ключу, в структуре для WSASend/WSARecv есть поле для этого ключа, NV>при первом ошибочном пакете из порта я убиваю клиента и убираю его из списка, остальные пакеты NV>просто не находят своего адресата. NV>в моей реализации это оказалось кстати ибо такой список клиентов у меня все равно уже поддерживался.
Здравствуйте, __AK__, Вы писали:
__A>Мена как раз вот это момент интересует, придет событие когда ПОЛНОСТЬЮ отправлены __A>или приняты данные, т.е. именно то количество, которое я указал в WSABUFF.len?
__A>Или придется делать так.
...