Re: fprintf && write

From
Boris Rudakov (2:5054/9.4)
To
Igor Sysoev ()
Date
2003-06-07T10:43:16Z
Area
RU.UNIX.PROG
Hello Igor!

05 июн 03 13:02, you wrote to me:

 IS> Boris Rudakov <Boris.Rudakov@p4.f9.n5054.z2.fidonet.org> wrote:

 >> Кста, чисто информации для: не знаю как в юниксах, а в НТе многие
 >> синхронные операции IO на самом деле - врапперы над асинхронными
 >> функциями API. Пример - сокеты. Ядро открывает сокеты всегда в
 >> асинхронном и только асинхронном режиме доступа. Если работать с
 >> ними основными функциями IO ReadFile/WriteFile, но не передавать
 >> структуру OVERLAPPED (она служит для контроля асинхронного IO и если
 >> вместо нее подсовывать NULL то это означает что ты желаешь чтобы
 >> вызов был блокирующим) то система говорит ERROR_INVALID_PARAMETER -
 >> иди, мол, лесом. OVERLAPPED давай. Экспериментально установлено что
 >> НТевые реализации send/recv - примитивнейшие врапперы над
 >> ReadFile/WriteFile, внутри ожидающие завершения асинхронного IO над
 >> сокетами.
 IS> Теперь мне понятно почему, если в NT попросить sendv() или WSASend()
 IS> послать, скажем, 4M в неблокирующийся сокет, они спокойно скопируют
 IS> все 4M в ядро и сразу же вернутся, сказав, что передали все 4M.

Если позволить себе немножечко отвлечся от эхотага (прощает то, что API ядра НТи по многом похоже на API ядра юникса), то, касаемо сокетов я хотел бы дать один важный совет, сильно помогающий портировать сетевой код между юниксами и НТей (с мастдаем чуть хуже так как там все в высшей степени криво).

НЕ НАДО без КРАЙНЕЙ необходимости юзать WSAxxx функции.

Дело в том, что сокеты - частный случай хэндлов файлов ядра с потоковым режимом доступа. Их принципиальное отличие от, скажем, пайпов в том, что ядро открывает их только для асинхронного режима доступа. Других принциписальных отличий нет, над сокетами так же работают ReadFile/WriteFile, DeviceIoControl (аналог юниксоидного ioctl) и ты пы. Поэтому советов два:

1. Если нет особых причин делать иначе, т.е. ты пишешь код ориентированный именно на работу с сокетами, юзай стандартные функции, общие и для юниксов и для виндов. send/recv вместо WSA аналогов и т.п. Избегай WSA где только можно. Исходя из опыта, реализация "одноименных" в юниксе и виндах функций содержит мало подводных камней и дает отличную портабельность.

2. Если ты пишешь существенно сложный многонитевый код ввода/вывода (сервер, сетевой клиент типа браузера или нечто аналогичное, нуждающееся в высокоэффекивном блоке управления IO) - юзай базовые средства ОС. Лучше всего писать два параллельных варианта для юникса и НТи. В обоих вариантах (для юникса я советов не дам, а вот в НТе такой опыт у меня есть) - следует написать универсальный код управления потоками вне зависимости от их типа. В своем таком НТевом коде я избегаю даже "канонизированных" send/recv, используя фундаментальные ReadFile/WriteFile.

Возвращаясь к сокетам, хочу заметить что в НТе "unix-compatible" функции - врапперы над фундаментальными функциями API, а WSAxxx - врапперы над врапперами :) Дерьмо, одним словом :)

 IS> --
 IS> Игорь Сысоев
 IS> http://sysoev.ru

Борис Рудаков,               In God we trust !
BBR

--- Be happy: BBR is looking at you !
 * Origin: АлкАголь малыми дозами безвреден в любых количествах (2:5054/9.4)