IOCompletionPort
От: __AK__  
Дата: 06.03.06 08:15
Оценка:
Добрый день. Есть недопонимание с IOCompletionPort.

overlapplus = new ...
overlapplus->type = send;

WSABUF buf;
buf.buf = buffer;
buf.len = BUFF_SIZE;
WSASend(op->sock_handle, &buf, 1, &b, &flags, overlapplus, 0);

1. Операция завершиться, когда будет отправлен весь буффер (например 1М)?
2. Если у меня на порту завершения несколько отложенных операций,
и клиент отсоединяется, как мне потом удалить все overlapplus связанные,
с данным сокетом.

Аналогично и для WSARecv.

Буду очень благодарен за ответ.
Re: IOCompletionPort
От: NeuroVirus Россия  
Дата: 06.03.06 08:18
Оценка:
Здравствуйте, __AK__, Вы писали:



__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 завершится сразу, в порт придет событие по завершении операции или ошибке,
также если клиент отсоединится то все отложенные/незавершенные запросы сразу придут в порт с кодом ошибки
Re[2]: IOCompletionPort
От: __AK__  
Дата: 06.03.06 08:34
Оценка:
Здравствуйте, NeuroVirus, Вы писали:

NV>WSASend завершится сразу, в порт придет событие по завершении операции или ошибке,


Мена как раз вот это момент интересует, придет событие когда ПОЛНОСТЬЮ отправлены
или приняты данные, т.е. именно то количество, которое я указал в WSABUFF.len?

Или придется делать так.

TotalSize = 1024
Current = 0

WSABUF buf;
buf.buffer = pBuffer;
buf.len = TotalSize;

WSASend(...,&buf...);

.........

GetQueuedCompletionStatus(..., &NumberOfBytes, )

Current += NumberOfBytes;
if (Current < TotalSize)
{
WSABUF buf;
buf.buffer = pBuffer + Current;
buf.len = TotalSize — Current;
WSASend(..., &buf,...)
}

Аналогично интересует и для WSARecv.
Re[3]: IOCompletionPort
От: NeuroVirus Россия  
Дата: 06.03.06 08:36
Оценка:
Здравствуйте, __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.




когда послано именно все, по крайней мере в моей практике .
а вот принято может быть меньше чем размер буфера
Re[4]: IOCompletionPort
От: __AK__  
Дата: 06.03.06 08:45
Оценка:
NV>когда послано именно все, по крайней мере в моей практике .
NV>а вот принято может быть меньше чем размер буфера

О! Это оличная новость, т.е. можно пачку WSASend накидать, и голову не греть.
Тогда еще вопрос, а если у тебя после GetComplitionStatus, отправленное
количество с тем что вернул GetComplitionStatus различается, что делать
отрубать киента?
Re[5]: IOCompletionPort
От: NeuroVirus Россия  
Дата: 06.03.06 09:10
Оценка:
Здравствуйте, __AK__, Вы писали:


NV>>когда послано именно все, по крайней мере в моей практике .

NV>>а вот принято может быть меньше чем размер буфера

__A>О! Это оличная новость, т.е. можно пачку WSASend накидать, и голову не греть.

__A>Тогда еще вопрос, а если у тебя после GetComplitionStatus, отправленное
__A>количество с тем что вернул GetComplitionStatus различается, что делать
__A>отрубать киента?

скорее всего такая ситуация будет вместе с кодом фатальной ошибки,
а в таком случае я отрубаю полюбому. но! сделайте свой сервер и стресс-тестер к нему и проверте
Re[6]: IOCompletionPort
От: __AK__  
Дата: 06.03.06 09:45
Оценка:
NV>скорее всего такая ситуация будет вместе с кодом фатальной ошибки,
NV>а в таком случае я отрубаю полюбому. но! сделайте свой сервер и стресс-тестер к нему и проверте

Ну это в любом случае. 8)
И еще, если не затруднит, один маленький лекбез.
Если у меня в очереди на завершение, например, 3 WSASend и 1 WSARecv. То если,
клиент разорвал соединение, по идее, в данном случае 4 раза сработает GetComplitionStatus.
(Я правильно понимаю) и для каждогй операции вернет количество байт = 0.
В какой момент очишать память связанную с контекстом пользователя, который разорвал соединение?
Как удостовериться, что все операции с данным пользователем завершены?
(Или, например, на каждую отложенную оперецию для контекста пользователя
делать AddRef, а после завершения Release? (есть общепринятая практика?))
Re[7]: IOCompletionPort
От: NeuroVirus Россия  
Дата: 06.03.06 09:53
Оценка:
Здравствуйте, __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 есть поле для этого ключа,
при первом ошибочном пакете из порта я убиваю клиента и убираю его из списка, остальные пакеты
просто не находят своего адресата.
в моей реализации это оказалось кстати ибо такой список клиентов у меня все равно уже поддерживался.
Re[8]: IOCompletionPort
От: __AK__  
Дата: 06.03.06 09:57
Оценка:
NV> по разному можно.
NV>1) как вы сами и сказали — подсчет "ссылок", тут главное сделать все аккуратно, чтоб не сбится со счета,
NV>однажды я стал получать ошибки отличные от PENDING но пакеты уходили в порт, у меня счет сбился,
NV>я не стал искать причину и сделал подругому, а именно
NV>2) список клиентов, каждый клиент имеет уникальный номер типа послед. счетчика или GUID-а (не адрес!),
NV>список индексирован по этому ключу, в структуре для WSASend/WSARecv есть поле для этого ключа,
NV>при первом ошибочном пакете из порта я убиваю клиента и убираю его из списка, остальные пакеты
NV>просто не находят своего адресата.
NV>в моей реализации это оказалось кстати ибо такой список клиентов у меня все равно уже поддерживался.

Тоже вариант. Большое спасибо за ответы.
Re[3]: IOCompletionPort
От: Michael Chelnokov Украина  
Дата: 08.03.06 12:25
Оценка:
Здравствуйте, __AK__, Вы писали:

__A>Мена как раз вот это момент интересует, придет событие когда ПОЛНОСТЬЮ отправлены

__A>или приняты данные, т.е. именно то количество, которое я указал в WSABUFF.len?

__A>Или придется делать так.

...

Второе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.