如何使用C++ socket编程并发向多个服务器发送数据?
How to concurrently send data to multiple servers using C++ socket programming?
我将一个程序部署到多台服务器上(假设服务器IP和提供服务的端口为192.168.1.101:10001
、192.168.1.102:10001
、192.168.1.103:10001
、192.168.1.104:10001
)。都是使用Linuxsocket
api的监听请求,可以独立完成任务。
现在,我想同时向所有四台服务器发送数据,以便它们可以并发执行任务。
我正在使用一台 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 导致程序因错误退出的线程。将线程存储在数组中,以便您可以加入它们或在循环中调用分离。
我将一个程序部署到多台服务器上(假设服务器IP和提供服务的端口为192.168.1.101:10001
、192.168.1.102:10001
、192.168.1.103:10001
、192.168.1.104:10001
)。都是使用Linuxsocket
api的监听请求,可以独立完成任务。
现在,我想同时向所有四台服务器发送数据,以便它们可以并发执行任务。
我正在使用一台 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 导致程序因错误退出的线程。将线程存储在数组中,以便您可以加入它们或在循环中调用分离。