我对我不太明白的行为有疑问:
我有两种c ++代码:
CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) connectionSocket, 0, NULL );
主题:
Client a;
a.clientsocket = connectionSocket;
a.testText()
a.sendSocket();
工作正常(sendSocket将一些测试数据发送到套接字)。
但是如果我这样做
Client a;
a.clientsocket = connectionSocket;
CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) &a, 0, NULL );
并使用 螺纹:
a.testText();
a.sendSocket();
只有testText()有效。
我有点困惑为什么会这样。我是C ++的爱好者: - )
编辑:
添加了Client类:
class Client
{
public:
SOCKET clientsocket;
Client()
{
}
~Client(){}
void displayMessage()
{
std::cout << "test message client class" << std::endl;
}
int sendSocket()
{
char *sendbuf = "CLIENT TEST";
send(clientsocket, sendbuf, (int)strlen(sendbuf),0);
closesocket(clientsocket);
return 0;
}
};
答案 0 :(得分:2)
我猜测在你的主线程中CreateThread成功,然后你的Client变量a超出了范围,因此被破坏了。
答案 1 :(得分:0)
Anon 可能在正确的轨道上超出了范围,但我认为它是connectionSocket
。但是,当您说a.sendSocket()
不起作用时,您必须提供更多有关您的意思的详细信息。应用程序崩溃了吗?你有例外吗?应用程序是否继续有效,但sendSocket()
调用未实际发送内容? 实际问题是什么?
答案 2 :(得分:0)
在第一种情况下,您传递一个connectionSocket,在第二种情况下,指向一个类型为Client的指针。也许你的意思是:
CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) a.clientsocket, 0, NULL );
答案 3 :(得分:0)
在我看来,这是一个超出范围的对象。 SOCKET只是一个int HANDLE值,并存储在一个成员中。当创建线程运行时,'a'超出了线程创建函数的范围,(或者在下一个accept()返回时被破坏)。
尝试:
客户a =新客户();
在多线程代码中在堆栈上分配对象之前,先考虑15次,然后决定动态分配。
PS - @Anon首先到达那里 - 我没注意到。答案 4 :(得分:0)
来自您的客户端类
SOCKET clientsocket;
无论何时将其传递给线程,SOCKET都会在其上调用复制构造函数。此复制构造函数可能未定义,或者可能尝试在同一端口上打开新连接并导致其失败。
将其更改为:
SOCKET* clientsocket;
然后拥有它,以便每当你想做...
a.clientsocket = connectionSocket;
变量“connectionSocket”是一个指针然后繁荣进入炸药。如果未将其声明为变量,则会调用复制构造函数,并且您将获得一个比之前使用的套接字更全新的套接字。我认为那应该有帮助吗?