server.start([&] (Socket socket) {
std::async(std::launch::async, [&] (Socket sock) {
socketstream stream(std::move(sock));
{
std::lock_guard<decltype(mutex)> lock(mutex);
streams.insert(&stream);
}
std::string line;
while (std::getline(stream, line)) {
std::cout << line << '\n';
std::lock_guard<decltype(*mutex)> lock(*mutex);
for (auto* sockstream : streams) {
if (sockstream == &stream) continue;
*sockstream << line;
}
}
streams.erase(&stream);
}, std::move(socket));
});
c2VydmVyLnN0YXJ0KFsmXSAoU29ja2V0IHNvY2tldCkgewogIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBbJl0gKFNvY2tldCBzb2NrKSB7CiAgICBzb2NrZXRzdHJlYW0gc3RyZWFtKHN0ZDo6bW92ZShzb2NrKSk7CiAgICB7CiAgICAgIHN0ZDo6bG9ja19ndWFyZDxkZWNsdHlwZShtdXRleCk+IGxvY2sobXV0ZXgpOwogICAgICBzdHJlYW1zLmluc2VydCgmc3RyZWFtKTsKICAgIH0KICAgIAogICAgc3RkOjpzdHJpbmcgbGluZTsKICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoc3RyZWFtLCBsaW5lKSkgewogICAgICBzdGQ6OmNvdXQgPDwgbGluZSA8PCAnXG4nOwogICAgICBzdGQ6OmxvY2tfZ3VhcmQ8ZGVjbHR5cGUoKm11dGV4KT4gbG9jaygqbXV0ZXgpOwogICAgICBmb3IgKGF1dG8qIHNvY2tzdHJlYW0gOiBzdHJlYW1zKSB7CiAgICAgICAgaWYgKHNvY2tzdHJlYW0gPT0gJnN0cmVhbSkgY29udGludWU7CiAgICAgICAgKnNvY2tzdHJlYW0gPDwgbGluZTsKICAgICAgfQogICAgfQogICAgCiAgICBzdHJlYW1zLmVyYXNlKCZzdHJlYW0pOwogIH0sIHN0ZDo6bW92ZShzb2NrZXQpKTsKfSk7