如何使用 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:10001
、192.168.1.102:10001
、192.168.1.103:10001
、192.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++ 套接字编程同时向多个服务器发送数据?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 上的 C 中的套接字编程(服务器、使用 select() 和 fd_set 的多线程)