2016-05-30 80 views
0

我想知道,如果有可能讓一個客戶端同時與多個服務器通信。據我所知,像firefox這樣的常見瀏覽器正在這樣做。C++:一個客戶端與多個服務器通信

我現在的問題是,客戶端必須監聽並等待來自服務器的數據,而不是自己請求它。它必須一次收聽多臺服務器。這甚至有可能嗎?如果客戶端正在偵聽服務器1並且服務器2發送了什麼,會發生什麼?包裹丟失還是會重新發送,直到客戶傳達成功的接收信息?使用的協議是TCP。

編輯:平臺是Windows。感謝你指出了Arunmu。

回答

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的,收銀臺看到一個全功能的服務器設計:
https://github.com/arun11299/cpp-reactor-server/blob/master/epoll/reactor.cc

+0

謝謝。這有幫助。 – YokeM

+0

@YokeM很高興幫助。 – Arunmu