【发布时间】:2014-12-25 00:27:24
【问题描述】:
if (m_Connections[t].socket != INVALID_SOCKET)
{
m_TCPResult = recv(m_Connections[t].socket, m_TCPRecvbuf, m_TCPRecvbuflen, 0);
if (m_TCPResult > 0)
{
printf("[TCPReceive] Bytes (m_TCPResult) received from %d: %d\n", m_Connections[t].socket, m_TCPResult);
// Deserialize the data
Packets::MainPacket receivedData;
memcpy(&receivedData, m_TCPRecvbuf, sizeof(receivedData));
// Check the type and do something with the data
CheckType(m_Connections[t].socket, receivedData);
}
else
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
printf("TCPReceive error: %d\n", WSAGetLastError());
}
}
所以我有这段代码。我需要做一个 memcpy() 来将传入的数据从 winsock 转换为应用程序可以读取的结构。但是,在 CheckType() 方法完成后,应用程序崩溃给我一个访问冲突读取位置错误。我删除了一次 memcpy() 方法进行检查,然后它工作正常(没有崩溃)。
我不知道问题可能是什么。我一直在 Google 上搜索,但没有发现任何有用的东西似乎可以解决我的问题
编辑:
更多信息:
// in the header
char m_TCPRecvbuf[DEFAULT_BUFLEN];
// receivedData struct
struct MainPacket
{
char type;
int id;
LoginData loginData;
vector<PlayerData> playerData;
};
【问题讨论】:
-
如果答案是“在头文件中”,它们是如何定义的? memcpy 到一个未知的数据结构看起来非常可疑。
-
CheckType包含什么? -
我用更多数据编辑了主要问题
-
CheckType 是一个简单的开关,它根据结构的类型执行某些操作(请参阅问题中的定义)
-
不应该像memcpy(&receivedData, m_TCPRecvbuf, sizeof(m_TCPRecvbuf));