Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Клиент-серверное приложение


Автор: Dogevec 26.7.2009, 18:52
Доброго времени суток. Мне необходимо реализовать соединение N клиентов и одного сервера на одной машине. Пробовал сокетами через петлю 127.0.0.1, очень медленно для моего приложения, так что их отметаем сразу. Прошу посоветовать другие способы, с учётом, что и клиенты и сервер запускаются ТОЛЬКО на одной машине)

P.S. Зарание благодарю=)

Автор: andrew_121 26.7.2009, 19:08
Dogevec, Сомневаюсь что может быть что-то бустрей лупбэка, в плане сокетов.

Автор: Dogevec 26.7.2009, 19:14
Так я и спрашиваю, есть ли возможность это сделать не через сокеты? Кто знает, подскажите, очень нужно, горю!!

Автор: GremlinProg 26.7.2009, 19:21

M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI


Добавлено через 4 минуты и 59 секунд
Цитата(Dogevec @  26.7.2009,  21:14 Найти цитируемый пост)
не через сокеты

тема "отзеркалена" обратно

Автор: Cheloveck 26.7.2009, 21:19
Самый быстрый способ (и самый опасный) - писать в общую память напрямую.

Автор: Dogevec 27.7.2009, 15:00
Как говориться, ищите да обрящите))
Цитата

Варианты
1. Буфер обмена. Недостаток в том, что любые другие процессы имеют к нему доступ. Что из этого следует, я думаю объяснять не надо.

2. Использовать сообщение WM_COPYDATA. Минусы - необходим цикл сообщений для каждого из участвующих процессов.

3. Отображаемые в память файлы. Плюсы - встроенная поддержка безопасности и большой объем передаваемых данных. Возможна передача данных более чем между двумя процессами. Но неоходимо обеспечить синхронизацию.

3. Mailslots. Также возможна передача данных более чем между двумя процессами. Используют одностороннюю передачу данных. Поддерживают broadcast. Лучше подходят для передачи небольших объемов данных.

4. Pipes. Бывают анонимные и именованные. Анонимные могут быть использованы только на одном компьютере. Хорошо подходят для связи двух процессов. Именованные - поддерживают связь между компьютерами.

5. Сокеты

Еще альтернативы - DDE(устаревший метод), RPC(для вызова процедур в других процессах), COM(если только для передачи данных - IMHO извращение)

Самым оптимальным вариантом, на мой взгляд являются отображаемые в память файлы(но только на одном компьютере)
    

Автор: kolobok0 27.7.2009, 15:45
Цитата(Dogevec @ 26.7.2009,  18:52)
..сокетами ...очень медленно для моего приложения...

Вы выставляли время ожидания на TCP уровне? Если нет - да, будет достаточно медленно.


удачи Вам
(круглый)

Автор: Dogevec 27.7.2009, 18:11
Вы имеете ввиду на стороне приёмника время ожидания? Если да, то устанавливал, если не это, то поясните пожалуйста

Автор: kolobok0 31.7.2009, 18:47
Цитата(Dogevec @ 27.7.2009,  18:11)
Вы имеете ввиду на стороне приёмника время ожидания? Если да, то устанавливал, если не это, то поясните пожалуйста

Код

    BOOL val = TRUE;
    setsockopt(soc, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val));



с уважением
(круглый)

Автор: SVN74 2.8.2009, 10:51
Цитата(Dogevec @  26.7.2009,  18:52 Найти цитируемый пост)
 Пробовал сокетами через петлю 127.0.0.1, очень медленно 

Если сделать размер передающего и принимающего буфера 1024*1024 - будет копировать  4Гб / 3мин, - это медленно?

Автор: Lazin 2.8.2009, 12:08
Цитата(Dogevec @  26.7.2009,  18:52 Найти цитируемый пост)
Мне необходимо реализовать соединение N клиентов и одного сервера на одной машине. Пробовал сокетами через петлю 127.0.0.1, очень медленно для моего приложения, так что их отметаем сразу. Прошу посоветовать другие способы, с учётом, что и клиенты и сервер запускаются ТОЛЬКО на одной машине)

может у тебя просто алгоритм не оптимальный?

Добавлено через 3 минуты и 16 секунд
к примеру у тебя может быть много вызовов send с небольшими объемами передаваемых данных, в этом случае у тебя будет медленная передача данных, независимо от используемой технологии IPC, в этом случае нужно изменить алгоритм так, что-бы у тебя больше данных передавалось за один send

Автор: REZiaMIX 2.8.2009, 16:53
В винде есть pipes , shared memory.
Вообще можно заюзать что-то из разряда boost.interprocess.
loopback сокеты очень быстрые, сам юзаю обертку , работает ну очень быстро. 
Незнаю что за объемы передаваемой информации должны быть , что сокеты не подойдут.

Автор: GrayCardinal 2.8.2009, 17:02
Dogevec, 
ОСЬ какая ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)