Pzz>>>300K — это много. M>>95% будут в режиме ожидания находиться и только 1 раз в минуту отправлять маленькие пакеты.
Pzz>А протокол самодельный?
Да
Pzz>А тебе так уж важно, чтобы работало и на linux и в венде?
Для Windows не особо важно, но удобнее тестировать общий код на Windows и может пригодиться кому-нибудь такое решение.
Pzz>Дело в том, что у линуха с вендой модель асинхронного ввода-вывода очень разная. На линухе мы дожидаемся готовности сокета (т.е., наличия у него места в буфере), потом туда делаем send(), сокет копирует данные в свой буфер и отправляет в сеть по мере возможности, а нас уведомляет, когда в него можно подпихнуть следущую порцию данных. Pzz>Венда же, наоборот, мы ей сразу даем порцию данных, а она сообщает, когда они отправлены. Это называется overlapped i/o.
В любом случаи я должен хранить буффер для отправки сам (для libuv тоже), и поэтому для отправки я не вижу проблем.
Вызываю send и жду, в Linux когда статус сокета измениться, в Windows когда операция завершиться.
Для чтения, в Windows нужно заранее выделить буфер. Вот тут отличия, так как зараняя выделить существенный буфер для 300К клиентов — это накладно.
А общий буфер для всех клиентов в Windows так наверно нельзя делать ? Или можно если только 1 поток будет работать с IoCompletionPort ?
Если нельзя, попробую выделить 1 байт и потом уже дочитать вторым вызовом recv().
Есть ещё какие-то варианты в Windows, без существенного буфера для каждого клиента ?
Pzz>Если учесть, что основная серверная платформа телерь линукс, может вообще, ну ее нафиг, эту венду?
Может и откажусь. Но пока вроде для моих задач, можно на обоих сделать.