Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
Liath

Несколько сокетов в одном приложении

10.02.2011, 22:05. Показов 5078. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!
Нужна помощь, нужно сделать прогу которая сразу работает с 2-мя сокетами.

Задача: слушать 1-ый сокет и передавать передавать все начинающееся с !текст на 2 сокет. (что-то типа ретранслятора)

Вопрос как организовать 2 сокета 1 как бы сервер второй как клиен все в 1 файле подскажите а то не выходит.... По 1 сделать могу, а скрестить не выходит....
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2011, 22:05
Ответы с готовыми решениями:

Несколько сокетов в одном приложении
Знакомый говорил, что если приложение будет держать несколько сокетов, то это может вызвать проблемы. Так ли это?

Несколько форм в одном приложении
Проблема состоит в следующем: Приложение состоит из формы, при нажатии на кнопку должно открыться окно для ввода нескольких данных и...

Несколько Proxy в одном приложении
Здравствуйте! Помогите, пожалуйста, с одной проблемой. Недавно на сервере Mail.Ru Агента в целях борьбы со спамерами сделали жёсткое,...

23
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.02.2011, 22:17
создаешь два сокета. коннектишься куда надо. из первого читаешь. во второй пишешь. все элементарно. хз что не понятно...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.02.2011, 05:39
Цитата Сообщение от Liath
Вопрос как организовать 2 сокета 1 как бы сервер второй как клиен все в 1 файле
если к серверу подключились, то открыть соединение
пока данные поступают, прочитать порцию, переслать порцию

если клиентов несколько, тогда надо принимать их в разные потоки
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
11.02.2011, 09:42
Цитата Сообщение от accept Посмотреть сообщение
если клиентов несколько, тогда надо принимать их в разные потоки
Может проще ставить O_NONBLOCK и любой мультиплексор?
Просто смысла в спящих 99% времени на ожидании I/O потоках как-то не видно...
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.02.2011, 11:34
Цитата Сообщение от g_u_e_s_t
Просто смысла в спящих 99% времени на ожидании I/O
чего ? 99% времени идёт передача текста, каждый поток передаёт своё сообщение
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
11.02.2011, 12:04
Цитата Сообщение от accept Посмотреть сообщение
чего ? 99% времени идёт передача текста, каждый поток передаёт своё сообщение
Не согласен, вы хотя бы вывод top посмотрите скажем для 1го апача или любого MTA под нагрузкой(там конечно не потоки но тут это без разницы). Сокеты, даже AF_UNIX на системах с zero-copy штука не очень быстрая... а представьте вариант, что эти самые строки вводятся ручками через телнет.
Как итог, программа большую часть времени спит в send()/recv().

Конечно архитектура поток/процесс на клиента имеет право на жизнь и имеет свои плюсы, но практика показывает, что по производительности это сильно проигрывает вариантам с мультипликсированием. Например такая архитектура не приемлема для серверов с одним серверным портом и connection-less транспортом (как пример DNS).
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.02.2011, 13:24
Цитата Сообщение от g_u_e_s_t
Как итог, программа большую часть времени спит в send()/recv().
один клиент посылает сообщение, программа его принимает, где она спит ?
если прошло какое-то время, значит сообщение послано
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
12.02.2011, 14:08
Цитата Сообщение от accept Посмотреть сообщение
один клиент посылает сообщение, программа его принимает, где она спит ?
если прошло какое-то время, значит сообщение послано
Честно, я не знаю что вам сказать... наверное мы говорим о чем-то разном.
Если у нас блокируемый I/O - спать будет в accept(), send/recv, connect, и т.д и тп.
не блокируемый - спать будем в мультиплексоре poll/select, ну или в epoll/kqueue

Причем тут какое-то время я не знаю...
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.02.2011, 19:28
accept, g_u_e_s_t, на дворе 21ый век. может хватит использовать техники программирования вековой давности?
boost.asio, и никаких потоков.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
12.02.2011, 21:05
niXman, а почему именно boost, а не скажем ACE или например POCO?
В конце концов, почему собственно C++, а не С (про офтопики этой ветки форума типа erlang уж и не спрашиваю).
0
13.02.2011, 02:10

Не по теме:


Чем больше знакомлюсь с бустом- тем больше знакомлюсь с отзывами о нем и больше понимаю что его-то ,лучше не использовать))

0
13.02.2011, 03:25

Не по теме:

Цитата Сообщение от lifestyle Посмотреть сообщение
тем больше знакомлюсь с отзывами о нем
например?

зы
за всю мою практику использования boost, любые отрицательные отзывы о нем, основывались на недостатке знаний/опыта. и ни одного отрицательного отзыва от компетентных прогеров ;)
так что boost тут не при чем.

0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.02.2011, 03:05
Цитата Сообщение от g_u_e_s_t
Если у нас блокируемый I/O - спать будет в accept(), send/recv, connect, и т.д и тп.
accept принимает очередное подключение и передаёт его потоку, который будет им заниматься
в потоке работает recv(), который читает по кускам
если кусок не прочитан полностью и клиент виснет дольше трёх секунд, он отключается
а если кусок прочитан, он проверяется на наличие последовательности
что будет если последовательность обнаружена? ну там неважно, можно в очередь добавить

нагрузка только из-за потоков
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.02.2011, 09:20
Цитата Сообщение от accept Посмотреть сообщение
в потоке работает recv(), который читает по кускам
если кусок не прочитан полностью и клиент виснет дольше трёх секунд, он отключается
Я в толк не возьму, вы пытаетесь спорить с этим кусочком POSIX?
If no messages are available at the socket and O_NONBLOCK is not set on the socket's file descriptor, recv() shall block until a message arrives.

Про таймер на 3 секунды + сигнал (ведь надо же разбудить блокированный recv) еще забавнее,
а если клиент по байту раз в 3 секунды отдавать начнет?

нагрузка только из-за потоков
Нагрузки тут могла бы возникнуть если вместо отсылки полученного сообщения была бы скажем тяжелая математика.
Могу повторить: ваши потоки 99% времени будут спать в блокированных сисколах, соответственно кроме оверхеда на их создание никакого эффекта не будет.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.02.2011, 06:54
вот пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <netinet/in.h>
#include <linux/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main(void)
{
    struct sockaddr_in data;
    int sockd, nsd;
    char buf[100];
    int n;
    
    sockd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    data.sin_family = AF_INET;
    data.sin_port = htons(1030);
    data.sin_addr.s_addr = inet_addr("127.0.0.1");
    
    bind(sockd, (const void *) &data, sizeof data);
 
    while (listen(sockd, 5) == 0) {
        printf("listen...\n");
        if ((nsd = accept(sockd, NULL, NULL)) >= 0)
            if ((n = recv(nsd, buf, 100, 0)) > 0) {
                printf("I get\n");
                close(nsd);
                printf("data: .%.*s.\n", n, buf);
                printf("size: %d\n", n);
            }
    }
    
    close(sockd);
    return 0;    
}
, где всё происходит сразу

выдержка из man recv

Code
1
2
3
4
5
6
       Если  на  сокете  не  доступно  ни  одного сообщения, то обсуждаемые функции
       ожидают  их  прибытия,  если  сокет  не  помечен  как   неблокирующий   (см.
       fcntl(2)), в противном случае возвращается значение -1, а внешняя переменная
       errno устанавливается в значение EAGAIN.  Все эти функции обычно  возвращают
       уже доступные данные вплоть до запрошенного объема, и не ждут, пока появятся
       данные полной запрошенной длины.

перейти в символьный режим в telnet мне не удалось, точно также выходит она, что-то получая
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.02.2011, 09:15
Цитата Сообщение от accept Посмотреть сообщение
выдержка из man recv

Code
1
2
3
4
5
6
       Если  на  сокете  не  доступно  ни  одного сообщения, то обсуждаемые функции
       ожидают  их  прибытия,  если  сокет  не  помечен  как   неблокирующий   (см.
       fcntl(2)), в противном случае возвращается значение -1, а внешняя переменная
       errno устанавливается в значение EAGAIN.  Все эти функции обычно  возвращают
       уже доступные данные вплоть до запрошенного объема, и не ждут, пока появятся
       данные полной запрошенной длины.
Ну, прочитайте ваш же ман внимательно. Там же даже русским языком сказано что ваш recv() блокируется пока клиент не пришлет что-то.
Простейший тест вашего же кода: nc 127.0.0.1 1030 и уходим пить чай. Возвращаемся, смотрим и видим сервер как спал себе спокойно в recv() так и спит.
PS: а еще в коде fd leak, но для примера это наверное не важно...
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.02.2011, 09:45
Цитата Сообщение от g_u_e_s_t
и уходим пить чай
пример демонстрирует, что даже если полблока данных придёт, это не заблокирует программу
это поправил

C
1
2
3
4
5
6
7
8
9
10
11
    while (listen(sockd, 5) == 0) {
        printf("listen...\n");
        if ((nsd = accept(sockd, NULL, NULL)) >= 0) {
            if ((n = recv(nsd, buf, 100, 0)) > 0) {
                printf("I get\n");
                printf("data: .%.*s.\n", n, buf);
                printf("size: %d\n", n);
            }
            close(nsd);
        }
    }

а если кто-то подключился и данных не посылает, то его отключают
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.02.2011, 10:00
Цитата Сообщение от accept Посмотреть сообщение
пример демонстрирует, что даже если полблока данных придёт, это не заблокирует программу
Я не понимаю, вы пытаетесь доказать, что сокет без O_NONBLOCK на самом деле не блокируется и все стандарты нагло врут???

а если кто-то подключился и данных не посылает, то его отключают
Да, да часа этак через 2 при дефолтных настройках TCP стека на том же линуксе.
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.02.2011, 10:06
давай мультиплексор свой, в виде кода, а то бла-бла-бла - это неинтересно
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.02.2011, 10:47
Цитата Сообщение от accept Посмотреть сообщение
давай мультиплексор свой, в виде кода, а то бла-бла-бла - это неинтересно
В смысле Вам показать пример к man select/poll/kqueue/epoll?

ЗЫ: вы проигнорировали животрепещущий вопрос:
пример демонстрирует, что даже если полблока данных придёт, это не заблокирует программу
Я не понимаю, вы пытаетесь доказать, что сокет без O_NONBLOCK на самом деле не блокируется и все стандарты нагло врут???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2011, 10:47
Помогаю со студенческими работами здесь

Несколько прокси в одном приложении
Всех приветствую! Недавно я начал изучать Си++, вот пишу мою программу... Проблема в следующем... В программе задаются 10 прокси из...

Несколько форм OpenGL в одном приложении
Всем доброго времени суток)) Столкнулся с такой проблемой, в приложении несколько форм OpenGL... Дописав первую форму, перешел к работе со...

Несколько подходов к работе с БД в одном приложении
Есть веб сайт ASP.net в нем импользуется несколько БД. Допустимо ли использовать разные подходы к работе с БД. например с одной базой...

А можно ли в одном приложении иметь в главном окне несколько дочерних с OpenGL?
А можно ли в одном приложении иметь в главном окне несколько дочерних с OpenGL? Добавлено через 43 минуты И как это сделать?

Несколько сущностей в одном веб-приложении и каждого свой кабинет.(Аутентификация и авторизация; java, jdbc)
Добрый день, Уважаемые коллеги. Пишу веб-приложение на java используя servlet API + JSP, DB MySQL + JDBC, Bootstrap и так далее. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru