А будуть ли на Линуксе работать асинхронные сокеты?
От: Grizzli  
Дата: 10.12.02 07:34
Оценка:
Под виндовс есть такая штука — Asynchronous Winsock. Очень хочется ее использовать, т.к. удобно. Однако встает вопрос совместимости с другими ОС, в частности Линукс. Что скажете, господа? Есть ли аналог асинхронных сокетов под линукс? А под другие ОС?
Re: А будуть ли на Линуксе работать асинхронные сокеты?
От: Willi  
Дата: 10.12.02 08:03
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>Под виндовс есть такая штука — Asynchronous Winsock. Очень хочется ее использовать, т.к. удобно. Однако встает вопрос совместимости с другими ОС, в частности Линукс. Что скажете, господа? Есть ли аналог асинхронных сокетов под линукс? А под другие ОС?


Да есть.

Устнаовить неблокируемый режим:
fcntl(nSocket, F_SETFL, O_NONBLOCK)


ожидание событий делается с помощью системного вызова select
\/\/i||i
Re: А будуть ли на Линуксе работать асинхронные сокеты?
От: ioni Россия  
Дата: 10.12.02 08:24
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>Под виндовс есть такая штука — Asynchronous Winsock. Очень хочется ее использовать, т.к. удобно. Однако встает вопрос совместимости с другими ОС, в частности Линукс. Что скажете, господа? Есть ли аналог асинхронных сокетов под линукс? А под другие ОС?


там есть семейство асинхронных функций с префиксом aio_ кажеться
Re[2]: А будуть ли на Линуксе работать асинхронные сокеты?
От: Grizzli  
Дата: 10.12.02 10:25
Оценка:
W>ожидание событий делается с помощью системного вызова select

А во время ожидания событий другой код может исполняться? Али енто ожидание блокирует выполнение программы?
Re[3]: А будуть ли на Линуксе работать асинхронные сокеты?
От: Willi  
Дата: 10.12.02 10:47
Оценка:
Здравствуйте, Grizzli, Вы писали:

W>>ожидание событий делается с помощью системного вызова select


G>А во время ожидания событий другой код может исполняться? Али енто ожидание блокирует выполнение программы?


Да, блокирует. А какой код ты хочешь исполнять в это время?
Когда в винде ты вызываешь GetMessage или WaitForSingleObject/WaitForMultipleObjects у тебя же ничего не выполняется.

В select ты можешь вставить набор дескрипторов (file, socket, pipe ...) и задать таймаут. При правильной организации логики программы этого достаточно.
\/\/i||i
Re[4]: А будуть ли на Линуксе работать асинхронные сокеты?
От: Grizzli  
Дата: 10.12.02 12:19
Оценка:
Здравствуйте, Willi, Вы писали:

W>Здравствуйте, Grizzli, Вы писали:


W>>>ожидание событий делается с помощью системного вызова select


G>>А во время ожидания событий другой код может исполняться? Али енто ожидание блокирует выполнение программы?


W>Да, блокирует. А какой код ты хочешь исполнять в это время?

W>Когда в винде ты вызываешь GetMessage или WaitForSingleObject/WaitForMultipleObjects у тебя же ничего не выполняется.

W>В select ты можешь вставить набор дескрипторов (file, socket, pipe ...) и задать таймаут. При правильной организации логики программы этого достаточно.


Гм. тут основная задача такая: в любой момент иметь возможность послать данные и получить.
Т.е. буду я ждать приема данных, (при этом еще не факт, что мне их пошлют).
И тут по логике программы парралельно надо мне надо будет сенд сделать... конечно можно по таймауту в цикле к примеру крутить селект ентот... но неужели по красивше никак сделать нельзя?
Re[5]: А будуть ли на Линуксе работать асинхронные сокеты?
От: Willi  
Дата: 10.12.02 12:28
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>Гм. тут основная задача такая: в любой момент иметь возможность послать данные и получить.

G>Т.е. буду я ждать приема данных, (при этом еще не факт, что мне их пошлют).
G>И тут по логике программы парралельно надо мне надо будет сенд сделать... конечно можно по таймауту в цикле к примеру крутить селект ентот... но неужели по красивше никак сделать нельзя?

Самая обычная задача. Главное определиться откуда поступает сигнал о том, что нужно отправлять данные.

Смысл в том, что ты должен одновременно ждать и приема данных и сигнала на отправку. Если сигнал поступает не через дескриптор, который можно затолкать в select. То можно сделать отдельный поток который ожидает этого сигнала. А для обмена даннымим между потоками использовать pipe. Тогда ты можешь ждать одновременно данных и на сокете и на pipe, если сработал сокет — принимаешь, если pipe — отправляешь. Идея понятна?
\/\/i||i
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.