сокеты: heap corruption после recvfrom
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 28.01.11 12:56
Оценка:
Помогите пожалуйста, уже не знаю в сторону чего копать.

При выполнении кода (см. ниже) при вызове closesocket выдается сообщение:
HEAP[example.exe]: Invalid Address specified to RtlFreeHeap( 082A0000, 082AE6A4 )

Приложение mfc dialog based, студия 2008


Если закомментарить вызов recvfrom, то все работает нормально.
В релизной конфигурации работает нормально, но если вызывать нескольо раз этот код, то виснет на последнем closesocket

Код:
//------------------------------------------------------------
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock != INVALID_SOCKET) {
sockaddr_in addr, fromAddr;
ZeroMemory(&addr, sizeof(addr));
ZeroMemory(&fromAddr, sizeof(fromAddr));

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ipAddress);
addr.sin_port = htons(0x89);

const BYTE buf[] = {0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x4b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x21, 0x00, 0x01};

int value = 500;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*) &value, sizeof(int));

if(sendto(sock, (char*)buf, sizeof(buf), 0, (SOCKADDR*)&addr, sizeof(addr)) != SOCKET_ERROR) {
int size = sizeof(fromAddr);

BYTE * recvbuf = new BYTE[1024];
ZeroMemory(recvbuf, 1024);

if(recvfrom(sock, (char*)recvbuf, 1024, 0, (SOCKADDR*)&fromAddr, &size) != SOCKET_ERROR &&
fromAddr.sin_addr.S_un.S_addr == addr.sin_addr.S_un.S_addr) {

}

shutdown(sock, SD_BOTH);
delete[] recvbuf;
}
closesocket(sock);
}
//------------------------------------------------------------
Re: сокеты: heap corruption после recvfrom
От: blackhearted Украина  
Дата: 28.01.11 12:58
Оценка:
Здравствуйте, _AND, Вы писали:

_AN>Помогите пожалуйста, уже не знаю в сторону чего копать.


BYTE * recvbuf = new BYTE[1024];
память точно выделяет?
Re[2]: сокеты: heap corruption после recvfrom
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 28.01.11 13:00
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Здравствуйте, _AND, Вы писали:


_AN>>Помогите пожалуйста, уже не знаю в сторону чего копать.


B>BYTE * recvbuf = new BYTE[1024];

B>память точно выделяет?

Да, recvfrom туда сохраняет правильный ответ.
Re: сокеты: heap corruption после recvfrom
От: Vamp Россия  
Дата: 28.01.11 14:22
Оценка: +1
_AN>При выполнении кода (см. ниже) при вызове closesocket выдается сообщение:
_AN>HEAP[example.exe]: Invalid Address specified to RtlFreeHeap( 082A0000, 082AE6A4 )

_AN>Приложение mfc dialog based, студия 2008

_AN>Если закомментарить вызов recvfrom, то все работает нормально.

Похоже, что проблема где-то в другом месте. В приведенном коде я ошибки не нашел.
Да здравствует мыло душистое и веревка пушистая.
Re: сокеты: heap corruption после recvfrom
От: alex_mah Россия www.elsy.ru
Дата: 01.02.11 08:43
Оценка:
Здравствуйте, _AND, Вы писали:

_AN>Помогите пожалуйста, уже не знаю в сторону чего копать.


_AN>При выполнении кода (см. ниже) при вызове closesocket выдается сообщение:

_AN>HEAP[example.exe]: Invalid Address specified to RtlFreeHeap( 082A0000, 082AE6A4 )

_AN>Приложение mfc dialog based, студия 2008



_AN>Если закомментарить вызов recvfrom, то все работает нормально.

_AN>В релизной конфигурации работает нормально, но если вызывать нескольо раз этот код, то виснет на последнем closesocket

_AN>...


Походу, recvfrom перед этим вызовом вылетает по какому-то exeption, соответственно до delete [] и shutdown дело не доходит. Ну а при следующем вызове происходят фейрверки.
Заверни код в try ... catch или в try ... finally и проверь, что там происходит на самом деле.
Re[2]: сокеты: heap corruption после recvfrom
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 03.02.11 06:33
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>Походу, recvfrom перед этим вызовом вылетает по какому-то exeption, соответственно до delete [] и shutdown дело не доходит. Ну а при следующем вызове происходят фейрверки.

_>Заверни код в try ... catch или в try ... finally и проверь, что там происходит на самом деле.

Проверял, ничего не происходит, те эксепшена нет.
Однако, выяснилось, что на другом компутере все нормально работает, независимо от конфигураций, во всех случаях.
Можно сделать вывод что проблема проявляется из-за разницы либо в студии/sdk, либо в самой системе, сети и тп.
Re[3]: сокеты: heap corruption после recvfrom
От: -prus-  
Дата: 03.02.11 18:16
Оценка:
Здравствуйте, _AND, Вы писали:

_AN>Однако, выяснилось, что на другом компутере все нормально работает, независимо от конфигураций, во всех случаях.

_AN>Можно сделать вывод что проблема проявляется из-за разницы либо в студии/sdk, либо в самой системе, сети и тп.

Где-то мне попадалась информация, что такое поведение было в дебаг версиях.
Ты пробовал и релизный вариант и дебаг? И оба вылетают?
С уважением,
Евгений
Re[4]: сокеты: heap corruption после recvfrom
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 04.02.11 03:34
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Где-то мне попадалась информация, что такое поведение было в дебаг версиях.

P>Ты пробовал и релизный вариант и дебаг? И оба вылетают?

Да, в дебаге сообщение выдает сразу при первом запуске, в релизе просто вылетает при повторных запусках этого кода. продолжая исследования, заметил такое-же поведение в другом проекте, использующем сокеты. Значит действительно, это проблемы с моей системой, а не с кодом.
Re[5]: сокеты: heap corruption после recvfrom
От: Michael Chelnokov Украина  
Дата: 09.02.11 19:11
Оценка:
Здравствуйте, _AND, Вы писали:

_AN> Значит действительно, это проблемы с моей системой, а не с кодом.


Что-то кривое перехватывает вызовы к Winsock?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.