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());
}
}
그래서이 코드가 있습니다. 들어오는 데이터를 winsock에서 응용 프로그램이 읽을 수있는 구조체로 변환하려면 memcpy()를 수행해야합니다. 그러나 CheckType() 메서드가 완료되면 응용 프로그램이 충돌하여 위치 정보 액세스 위반 오류가 표시됩니다. memcpy() 메서드를 한 번 제거하고 잘 작동합니다 (충돌 없음).memcpy : 액세스 위반 읽기 위치 이후의 충돌
나는이 문제가 무엇인지 모릅니다. 나는 Google에서 검색 한 적이 있지만 내 문제에 대한 해결책이 될 것으로 보인다 유용한 아무것도 발견하지 않았습니다
편집 :
일부 추가 정보를 원하시면 :
// in the header
char m_TCPRecvbuf[DEFAULT_BUFLEN];
// receivedData struct
struct MainPacket
{
char type;
int id;
LoginData loginData;
vector<PlayerData> playerData;
};
답변이 "헤더 파일에서"인 경우 어떻게 정의됩니까? memcpy가 알려지지 않은 데이터 구조에 의심스러워 보인다. – gnasher729
그리고'CheckType'에는 무엇이 들어 있습니까? – molbdnilo
더 많은 데이터로 주 질문을 편집했습니다. – Dries