мы получим прямо к делу, следующий сниппет возвращается
Unhandled exception at 0x7786AA3C (ntdll.dll) in Project4.exe: 0xC0000374: A heap has been corrupted (parameters: 0x7787FE38).
Snippet:
while(true)
{
if(WSALookupServiceNext(lookup_handle,flags,&query_set_length,query_set)==NO_ERROR)
{
char buffer[40] = {0};
DWORD buffer_size = sizeof(buffer);
device_socket_address = (SOCKADDR_BTH*)query_set->lpcsaBuffer->RemoteAddr.lpSockaddr;
result = device_socket_address->btAddr;
WSAAddressToString(query_set->lpcsaBuffer->RemoteAddr.lpSockaddr,sizeof(SOCKADDR_BTH),NULL,buffer,&buffer_size);
fprintf(stdout,"found device: %s - %s\n", buffer,query_set->lpszServiceInstanceName);
break;
}
}
Разрыв происходит на WSAAddressToString
перед вызовом WSALookupServiceNext
//start the LookUp service for bluetooth devices
if(WSALookupServiceBegin(query_set,flags,&lookup_handle)==SOCKET_ERROR)
{
fprintf(stderr, "something went completely wrong... %d",WSAGetLastError());
system("PAUSE");
ExitProcess(2);
}
Инициализация набора запросов
DWORD query_set_length = sizeof(WSAQUERYSET);
DWORD flags = LUP_CONTAINERS | LUP_FLUSHCACHE | LUP_RETURN_NAME | LUP_RETURN_ADDR;
WSAQUERYSET query_set = (WSAQUERYSET*)malloc(query_set_length);
ZeroMemory(query_set,query_set_length);
query_set->dwSize = query_set_length;
query_set->dwNameSpace = NS_BTH;
query_set->dwNumberOfCsAddrs = 0;
Обновление: источником проблемы является WSALookupServiceNext
, я подозреваю, что мой дескриптор (lookup_handle) передан неправильно.
Мой вопрос, что вызвало кучу коррупции, и как я могу ее исправить?
Я просто хочу найти устройство и смогу отправить ему тестовую строку.
Я удалил LUP_FLUSCACHE
и LUP_CONTAINERS
из своих флагов,
DWORD flags = LUP_RETURN_NAME | LUP_RETURN_ADDR;
и использовать его только в WSALookupServiceBegin
if(WSALookupServiceBegin(query_set,flags |= LUP_FLUSHCACHE | LUP_CONTAINERS,&lookup_handle)==SOCKET_ERROR)
{
fprintf(stderr, "something went completely wrong... %d",WSAGetLastError());
system("PAUSE");
ExitProcess(2);
}
это, кажется, предотвращает проблему. Я просто прочитал эту запись MSDN
хе-хе, я также использовал fprintf для stdin вместо stdout (могу ли я гореть в вечном огне).
WSALookupServiceNext
илиWSAAddressToString
, недостаточно велик, и куча становится перегруженной.