如何使用 C++ 套接字编程同时向多个服务器发送数据?

Posted

技术标签:

【中文标题】如何使用 C++ 套接字编程同时向多个服务器发送数据?【英文标题】:How to concurrently send data to multiple servers using C++ socket programming? 【发布时间】:2021-12-15 00:12:24 【问题描述】:

我将一个程序部署到多台服务器上(假设服务器 IP 和提供服务的端口是192.168.1.101:10001192.168.1.102:10001192.168.1.103:10001192.168.1.104:10001)。都是使用Linuxsocket api监听请求,可以独立完成任务。

现在,我想同时向所有四台服务器发送数据,以便它们可以同时执行任务。

我正在使用一台 Windows 10 PC,使用 C++ Socket 发送数据。 send_data的基本流程如下:

void send_data(string& server_ip, string& server_port, vector<char>& buf) 
    struct addrinfo ...;           // set the server information
    SOCKET socket = socket(...);   // create the socket object
    connect(socket, ...);          // connect the server
    send(socket, buf, ...);        // send the buf data

顺序发送数据到四台服务器时可以这样,例如,

vector<char> bufdata(...);
char* server_ips = "192.168.1.101", "192.168.1.102", "192.168.1.103", "192.168.1.104";
char* port = "10001";
for (int i = 0; i < 4; ++i) 
    send_data(server_ips[i], port, bufdata);

我期望主机客户端可以同时发送数据。我试过以下方法:

for (int i = 0; i < 4; ++i) 
    std::thread t(send_data, server_ips[i], port, bufdata); 

但是程序将没有运气退出。

你能帮忙给点建议吗?谢谢。

【问题讨论】:

【参考方案1】:

不确定这是唯一的问题,但鉴于您共享的内容,主线程不会等待工作线程完成其任务。

根据这个答案:When the main thread exits, do other threads also exit?,当主线程从main()返回时,进程将被终止。

建议的修复:

int main() 
    // .. your logic here
    std::vector<std::thread> threads;
    for (int i = 0; i < 4; ++i) 
        std::thread t(send_data, server_ips[i], port, bufdata); 
        threads.push_back(std::move(t));
    

    for (int i = 0; i < 4; ++i) 
        if (threads[i].joinable())
            threads[i].join(); // wait for threads[i] to finish
    

    // .. clean up

【讨论】:

std::thread t(send_data, server_ips[i], port, bufdata); threads.push_back(std::move(t)); 可以简化为threads.emplace_back(send_data, server_ips[i], port, bufdata); 另外,在这个用例中调用join() 之前不需要检查joinable()【参考方案2】:

您不是joining 或detaching 导致程序错误退出的线程。将线程存储在一个数组中,以便您可以加入它们或在循环中调用 detach。

【讨论】:

是的,成功了!谢谢! 在这种情况下不要分离线程。您仍然会遇到程序在线程仍在运行时退出的问题。退出前需要加入线程

以上是关于如何使用 C++ 套接字编程同时向多个服务器发送数据?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 套接字 Send() 线程安全

Windows 上的 C 中的套接字编程(服务器、使用 select() 和 fd_set 的多线程)

socket.io 如何跨多个服务器发送消息?

关于发送/接收的问题

C++ 如何使用 Socket 类向 HTTP 服务器发送数据和接收响应

使用 socket.io 向特定客户端发送消息,同时套接字 id 快速变化