2017-12-03 178 views
1

我想寫一個服務器,接受來自多個客戶端的郵件,直到它收到N個郵件,處理這批數據並將回覆「完成」發送給所有客戶端。套接字:發送郵件給幾個客戶端

如果我從客戶端收到數據後立即向客戶端發送消息「完成」,此代碼正常工作。在批處理完成後,如何「保存」所有客戶端並在稍後發送消息給每個客戶端?

while (true) { 
    listen(sock, 1000); 
    newsock = accept(sock, (struct sockaddr *) &cli_addr, &clilen); 
    n = read(newsock, buffer, read_len); 
    if (n < 0) { 
     cout << "ERROR reading from the socket" << endl; 
     continue; 
    } 
    memcpy(data + (msg_count * tuple_size), buffer, tuple_size); 
    n = write(newsock, "done\n", 5); //sending the message to the current client 
    msg_count++; 
    if (msg_count >= batch_size) { 
     msg_count = 0; 
     doSomethingWithTheData(data); 
     //I want to send the message to all the clients here 
    } 
    bzero(buffer, read_len); 
} 
+0

您是否嘗試過設置Cookie? – Arash

+0

@ArashMohammadi不,我還沒有嘗試過,現在我要讀一下它。如果服務器和所有客戶端都在同一臺PC上,Cookie會起作用嗎? – vgeclair

+0

如果客戶端可以發送多條消息,則可能需要查看「select」或「epoll」。 – user4581301

回答

1

嘗試類似這樣的東西。

while (true) { 
    std::list<int> socks; 
    listen(sock, 1000); 
    newsock = accept(sock, (struct sockaddr *) &cli_addr, &clilen); 
    n = read(newsock, buffer, read_len); 
    if (n < 0) { 
     cout << "ERROR reading from the socket" << endl; 
     continue; 
    } 
    memcpy(data + (msg_count * tuple_size), buffer, tuple_size); 
    socks.push_back(newsock); 
    msg_count++; 
    if (msg_count >= batch_size) { 
     msg_count = 0; 
     doSomethingWithTheData(data); 

     //I want to send the message to all the clients here 
     msg_count -= socks.size(); 
     while (!socks.empty()) { 
      newsock = socks.front(); 
      n = write(newsock, "done\n", 5); //sending the message to the current client 
      close(newsock); 
      socks.pop_front(); 
     } 
    } 
    bzero(buffer, read_len); 
} 

FYI的bzero()功能已被棄用(標記爲在POSIX.1-2001 LEGACY):(3)在新的程序使用memset的。 POSIX.1-2008刪除了bzero的規格()

+0

正確。無論如何,你必須這樣做,vgeclair,因爲目前你只是在沒有釋放襪子的情況下分配襪子。 – user2328447

+0

我剛剛嘗試過,但它在這一行中給出了一個「Broken pipe」錯誤: 'n = write(sock,「done \ n」,5);' 你確定應該給'sock'添加'sock'列表而不是'newsock'?它似乎始終具有相同的價值。 – vgeclair

+0

您似乎是正確的,@vgeclair。 'sock'是你正在收聽的套接字,而不是連接到客戶端的套接字。 – user4581301

-1

你試過zeroMq了嗎?例如 http://zguide.zeromq.org/cpp:rrworker

+0

不,我沒有嘗試過。它會如何幫助記住幾個客戶? – vgeclair

+0

我的想法是擴展請求 - 答覆模式,其中 n客戶端連接到前端套接字並將其分派給批處理員。 工作人員完成對n客戶端的作業前端套接字響應 – fbalicchia

相關問題