2017-12-03 111 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

相关问题