gpt4 book ai didi

c++ - C++中的多线程,从套接字接收消息

转载 作者:行者123 更新时间:2023-11-28 00:19:01 24 4
gpt4 key购买 nike

我已经学习了 8 个月的 Java,但决定在业余时间学习一些 C++。

我目前正在使用 minGW 在 QT 中制作多线程服务器。我的问题是,当客户端连接时,我创建了一个客户端实例(它是一个类)并在客户端类构造函数中传递套接字。

然后我在客户端对象 (startClient()) 中启动一个线程,该线程将等待消息,但它没有。顺便说一句,startClient 是我创建线程的方法。请参阅下面的代码。

然后会发生什么?是的,当我尝试向服务器发送消息时,只有错误,服务器不会打印出新客户端连接,并且由于某种原因我的计算机开始非常努力地工作。在我关闭服务器程序之前,qtcreator 变得非常慢。

我实际上想要实现的是一个派生线程的对象,但我听说在 C++ 中这样做并不是一个好主意。

服务器中的监听器循环:

for (;;)
{
if ((sock_CONNECTION = accept(sock_LISTEN, (SOCKADDR*)&ADDRESS, &AddressSize)))
{
cout << "\nClient connected" << endl;

Client client(sock_CONNECTION); // new object and pass the socket
std::thread t1(&Client::startClient, client); //create thread of the method
t1.detach();
}
}

客户端类:

Client::Client(SOCKET socket)
{
this->socket = socket;
cout << "hello from clientconstructor ! " << endl;
}

void Client::startClient()
{
cout << "hello from clientmethod ! " << endl;

// WHEN I ADD THE CODE BELOW I DON'T GET ANY OUTPUT ON THE CONSOLE!
// No messages gets received either.
char RecvdData[100] = "";
int ret;
for(;;)
{

try
{
ret = recv(socket,RecvdData,sizeof(RecvdData),0);
cout << RecvdData << endl;
}
catch (int e)
{
cout << "Error sending message to client" << endl;
}

}
}

最佳答案

分离后,您的 Client 对象似乎超出了范围。

if (/* ... */)
{
Client client(sock_CONNECTION);
std::thread t1(&Client::startClient, client);
t1.detach();
} // GOING OUT OF SCOPE HERE

您需要创建客户端对象的指针并对其进行管理,或者在不会超出范围的更高级别定义它。

关于c++ - C++中的多线程,从套接字接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com