2016-05-30 3 views
0

Мне было интересно, можно ли одному клиенту одновременно общаться с несколькими серверами. Насколько я знаю, обычные браузеры, например, firefox, делают именно это.C++: Один клиент, взаимодействующий с несколькими серверами

Проблема, с которой я столкнулся сейчас, заключается в том, что клиент должен слушать и ждать данных с сервера, а не запрашивать их сам. Он должен слушать сразу несколько серверов. Возможно ли это? Что произойдет, если клиент слушает сервер 1, а сервер 2 отправляет что-то? Пакет потерян или будет отправлен повторно, пока клиент не сообщит об успешном получении? Используемый протокол - TCP.

Редактировать: платформа Windows. Спасибо, что указали это на Арунму.

ответ

0

Это ничем не отличается от обычного программирования сокетов с использованием select/poll/epoll ИЛИ с использованием пула потоков или использования процесса за подключение или любой другой модели, которая вам известна.
Я могу показать вам грубый псевдокод о том, как это сделать с помощью epoll. ПРИМЕЧАНИЕ. Ни одна из моих функций не существует в C++, ее просто для объяснения цели. И я также полагаю, что вы на Linux, так как вы ничего не упомянули о платформе.

socket sd = connect("server.com", 8080); 
sd.set_nonblocking(1); 
epoll_event event; 
event.data.fd = sd 
epoll_ctl(ADD, event); 
... 
... 
while (True) { 
    auto n = epoll_wait(events, 1); 
    for (int i : 1...n) { 
    if (events[i].data.fd == sd) // The socket added in epoll_ctl 
    { 
     std::thread(&Session::read_handler, rd_hndler_, sd); // Call the read in another thread or same thread 
    } 
    } 
} 

Надеюсь, у вас есть суть. По сути, подумайте о сервере как о клиенте и клиенте, как о сервере, и у вас есть проблема, которую вы решили (вроде). Проверьте ссылку ниже, чтобы узнать больше о Epoll
https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/

Чтобы увидеть полностью функциональный дизайн сервера с помощью Epoll, Checkout:
https://github.com/arun11299/cpp-reactor-server/blob/master/epoll/reactor.cc

+0

Спасибо. Это помогло. – YokeM

+0

@YokeM Рад помочь. – Arunmu

Смежные вопросы