C++ - 创建线程错误
C++ - CreateThread Error
我正在使用VC++ 2012 Express创建一个多线程聊天客户端-服务器。代码改编自这里:http://www.codeproject.com/Articles/14032/Chat-Client-Server
服务器似乎工作正常。但是,不知何故,客户端无法启动线程来接收消息。GetLastError()
函数在调用时返回 8。
下面是客户端代码的代码片段:
#include "Chatter_Client.hpp"
CMessenger MessObj;
//... CMessenger::Init initializes Winsock, socket, and connection.
int CMessenger::RecMessage()
{
char buffRetData[4096];
int stat;
stat = recv(conn, buffRetData, 4096, 0);
if(stat == -1) {
cout << "Message not received!" << endl;
return 1; // gagal
} else {
cout << "-->" << buffRetData << "n";
return 0; // looping lagi~
}
}
DWORD WINAPI MessageRecThread(LPVOID pParam)
{
for(;;) {
Sleep(50);
if(MessObj.RecMessage())
break;
}
return 0;
}
int main()
{
string buf;
DWORD RecThreadID;
string sServerAddress;
int iPort;
for(;;) {
cout << "Server address: ";
cin >> sServerAddress;
if (sServerAddress.size() == 0) {
cout << "No Address entered!" << endl;
} else break;
}
cout << "Server port: ";
cin >> iPort;
MessObj.Init(sServerAddress.c_str(), iPort);
if(!MessObj.IsConnected()) {
cout << "Connection error!";
_getch();
return -1;
}
Sleep(30);
HANDLE RecThread = CreateThread(NULL, 20000, MessageRecThread, NULL, 0, &RecThreadID);
if(RecThread == NULL) {
cout << "Listener thread cannot be created! ERROR CODE: " << GetLastError() << endl;
_getch();
return 1;
} else {
cout << "Yey masuk!" << endl;
}
for(;;) {
cin >> buf;
if(MessObj.SendMessage(buf)) {
cout << "Connection lost!" << endl;
break;
}
}
cout << "Terminating client...";
_getch();
return 0;
}
和标题:
#include <cstdio>
#include <winsock2.h>
#include <conio.h>
#include <iostream>
#include <string>
#include <windows.h>
#pragma comment(lib, "WS2_32.lib")
using namespace std;
class CMessenger
{
public:
CMessenger();
~CMessenger();
void Init(string iIP, int iPort);
int SendMessage(string sMessage);
int RecMessage();
bool IsConnected();
private:
bool ConnStatus;
string sIPAddress;
int sPort;
SOCKET conn;
};
我尝试使用 C++11 的<thread>
,但是当调用线程类时,调试器立即调用了 abort()
。
有什么线索吗?
PS:这段代码编译。
编辑
这是新::Init
的片段,并进行了一些编辑:
void CMessenger::Init(const string& iAddress, const string& iPort)
{
// init winsock
WSAData wsData;
int stat = WSAStartup(MAKEWORD(2,0), &wsData);
if (stat != 0) {
cerr << "ERROR: WINCODE " << WSAGetLastError() << endl;
return;
}
// get server info
addrinfo hints, *res, *p_hints;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
stat = getaddrinfo(iAddress.c_str(), iPort.c_str(), &hints, &res);
if(stat != 0) {
cerr << "ERROR: " << gai_strerror(stat) << endl;
return;
}
void *addr;
char ipstr[INET6_ADDRSTRLEN];
p_hints = res;
sockaddr_in *ip = (struct sockaddr_in*)p_hints->ai_addr;
addr = &(ip->sin_addr);
// convert to string and print it
inet_ntop(p_hints->ai_family, addr, ipstr, sizeof ipstr);
cout << "Server IP: " << ipstr << endl;
// init socket
conn = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (conn == INVALID_SOCKET) {
cout << "SOCKET ERRORn";
return;
}
// connect to server
stat = connect(conn, res->ai_addr, res->ai_addrlen);
if(stat != 0) {
cerr << "ERROR: " << WSAGetLastError() << endl;
return;
}
// connect OK
sPort = atoi(iPort.c_str());
sAddress = iAddress;
cout << "Connection established." << endl << endl;
ConnStatus = true;
Sleep(30);
return;
}
仍然有线程问题..
刚刚尝试了您的代码,用存根替换了缺少的方法,并且没有任何问题地创建了胎面。确保你的 MessObj::Init() 方法没有伤害(内存损坏)。
还有一个补充:
CMessanger
{
...
void Init(string iIP, int iPort)
...
}
string sServerAddress;
...
MessObj.Init(sServerAddress.c_str(), iPort);
这是不好的风格 - 对许多字符串对象副本和字符串>字符* ->字符串转换。如果传递的字符串未在 CMessenger::Init() 方法中"复制",则应将该方法更改为
void Init(const string& iIP, int iPort)
并称它
MessObj.Init(sServerAddress, iPort);
如果字符串参数在方法中复制,那么您仍然按值传递参数,但在方法中使用可移动语义,例如:
void Init(string iIP, int iPort)
{
m_ip = std::move(iIP);
}
相关文章:
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++使用params创建线程函数会导致转换错误
- 是什么导致了Unity 3D中的"错误线程异常"?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 线程时访问静态映射时出现隔离错误
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C++多线程程序:变量定义为类成员的隔离错误
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 线程 std::调用未知类型,无法专门化函数错误
- 停止 winapi 线程时出现错误行为
- C++线程错误
- C++线程错误:没有名为"类型"MINGW 的类型
- 可中断线程类 C++11 - 遇到错误?
- 分离的线程:在繁忙时销毁互斥锁 错误C++
- 为同一向量C++运行多个线程时出现分段错误
- 查找最低值.功能.错误:线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x7fff5fc89000)
- MINGW错误:“线程”不是“ STD”的成员