如何使用C++ socket编程并发向多个服务器发送数据?

How to concurrently send data to multiple servers using C++ socket programming?

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

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

我正在使用一台 Windows 10 台 PC 发送数据,使用 C++ 套接字。 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); 
}

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

能不能帮忙给点建议?谢谢。

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

根据此答案:When the main thread exits, do other threads also exit?,当主线程 returns 来自 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
}

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