Информация об изменениях

Сообщение Re[6]: TCP & libuv от 27.11.2022 22:18

Изменено 27.11.2022 22:19 maks1180

Re[6]: TCP & libuv
Pzz>>>300K — это много.
M>>95% будут в режиме ожидания находиться и только 1 раз в минуту отправлять маленькие пакеты.

Pzz>А протокол самодельный?

Да

Pzz>А тебе так уж важно, чтобы работало и на linux и в венде?

Для Windows не особо важно, но удобнее тестировать общий код на Windows и может пригодиться кому-нибудь такое решение.

Pzz>Дело в том, что у линуха с вендой модель асинхронного ввода-вывода очень разная. На линухе мы дожидаемся готовности сокета (т.е., наличия у него места в буфере), потом туда делаем send(), сокет копирует данные в свой буфер и отправляет в сеть по мере возможности, а нас уведомляет, когда в него можно подпихнуть следущую порцию данных.

Pzz>Венда же, наоборот, мы ей сразу даем порцию данных, а она сообщает, когда они отправлены. Это называется overlapped i/o.

В любом случаи я должен хранить буффер для отправки сам, и поэтому для отправки я не вижу проблем.
Вызываю send и жду, в Linux когда статус сокета измениться, в Windows когда операция завершиться.

Для чтения, в Windows нужно заранее выделить буфер. Вот тут отличия, так как зараняя выделить существенный буфер для 300К — это накладно.
А общий буфер для всех клиентов в Windows так наверно нельзя делать ? Или можно если только 1 поток будет работать с IoCompletionPort ?
Если нельзя, попробую выделить 1 байт и потом уже дочитать вторым вызовом recv().
Есть ещё какие-то варианты в Windows, без существенного буфера для каждого клиента ?

Pzz>Если учесть, что основная серверная платформа телерь линукс, может вообще, ну ее нафиг, эту венду?

Может и откажусь. Но пока вроде для моих задач, можно на обоих сделать.
Re[6]: TCP & libuv
Pzz>>>300K — это много.
M>>95% будут в режиме ожидания находиться и только 1 раз в минуту отправлять маленькие пакеты.

Pzz>А протокол самодельный?

Да

Pzz>А тебе так уж важно, чтобы работало и на linux и в венде?

Для Windows не особо важно, но удобнее тестировать общий код на Windows и может пригодиться кому-нибудь такое решение.

Pzz>Дело в том, что у линуха с вендой модель асинхронного ввода-вывода очень разная. На линухе мы дожидаемся готовности сокета (т.е., наличия у него места в буфере), потом туда делаем send(), сокет копирует данные в свой буфер и отправляет в сеть по мере возможности, а нас уведомляет, когда в него можно подпихнуть следущую порцию данных.

Pzz>Венда же, наоборот, мы ей сразу даем порцию данных, а она сообщает, когда они отправлены. Это называется overlapped i/o.

В любом случаи я должен хранить буффер для отправки сам, и поэтому для отправки я не вижу проблем.
Вызываю send и жду, в Linux когда статус сокета измениться, в Windows когда операция завершиться.

Для чтения, в Windows нужно заранее выделить буфер. Вот тут отличия, так как зараняя выделить существенный буфер для 300К клиентов — это накладно.
А общий буфер для всех клиентов в Windows так наверно нельзя делать ? Или можно если только 1 поток будет работать с IoCompletionPort ?
Если нельзя, попробую выделить 1 байт и потом уже дочитать вторым вызовом recv().
Есть ещё какие-то варианты в Windows, без существенного буфера для каждого клиента ?

Pzz>Если учесть, что основная серверная платформа телерь линукс, может вообще, ну ее нафиг, эту венду?

Может и откажусь. Но пока вроде для моих задач, можно на обоих сделать.