CSocket :: Создать исключение броска в моем приложении MFC - PullRequest
1 голос
/ 18 июля 2009

У меня приложение (VC MFC) запущено с gflags с включенным Pageheap для отслеживания повреждения кучи страниц.

Теперь приложение аварийно завершило работу и показывает эту ошибку. Я не мог интерпретировать эти строки (кроме ощущения недоступности ресурса)

Может кто-нибудь пролить свет на то, что именно является причиной, вызвавшей сбой приложения?

(информация: Приложение является многопоточным, около 500 запущенных потоков на многопроцессорной машине)

kernel32!RaiseException+53 
msvcrt!_CxxThrowException+36 
mfc42u!AfxThrowResourceException+19 
mfc42u!AfxRegisterWndClass+ab 
mfc42u!CAsyncSocket::AttachHandle+5c 
mfc42u!CAsyncSocket::Socket+25 
mfc42u!CAsyncSocket::Create+14 

Ответы [ 3 ]

6 голосов
/ 28 января 2010

Эта же проблема свела меня с ума, но, наконец, я исправил ее, и она работает. Это ошибка библиотеки сокетов MFC, которая в потоке [кроме основного потока приложения], если мы пытаемся сделать что-то вроде

CSocket socket;
socket.Create();

Будет выброшено необработанное исключение. Я нашел статью об этом Посмотрите, что Microsoft говорит об этом

, который сказал что-то от Microsoft, но это мне тоже не помогло. Итак, вот обходной путь, который я нашел, и я надеюсь, что он может помочь таким разочарованным парням, как я.

Внутри темы, сделайте это

CSocket mySock;
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
mySock.m_hSocket= sockethandle;

После этого НЕ вызывайте mySock.Create, так как он был создан уже через присвоение дескриптора сокета. Я не уверен, что мы можем использовать mySock.Attach (sockethandle), так как я еще не пробовал.

После этого вы можете позвонить в Connect и т. Д. Напрямую.

Когда вы закончите использовать сокет, НЕ вызывайте mySock.Close() - скорее вызовите closesocket(mySock.m_hSocket); И это освободит объект сокета. Если Attach работает в вышеупомянутом случае, то я думаю, что нам нужно сделать Detach здесь, когда освободить сокет.

Удачи

0 голосов
/ 25 июня 2018

У меня была та же проблема, и после многих попыток я заметил следующую ссылку CAsyncSocket:

Создать не является потокобезопасным. Если вы вызываете его в многопоточной среде, где он может вызываться одновременно разными потоками, обязательно защищайте каждый вызов мьютексом или другой блокировкой синхронизации. После добавления синхронизации Mutex он больше не генерирует исключение.

0 голосов
/ 19 июля 2009

Интересно, действительно ли это ваша проблема с повреждением кучи или ваша программа только что столкнулась с ограничением ресурсов в результате работы с Pageheap.

Я не могу вспомнить точные детали, но Pageheap влечет за собой дополнительные накладные расходы памяти, настолько, что вы можете исчерпать память гораздо раньше, чем без включения Pageheap.

С 500 запущенными потоками у вас есть 1 МБ стека для каждого плюс любая память, которую они динамически распределяли по пути.

CAsyncSocket::AttachHandle вызывает AfxThrowResourceException, если не может создать окно. Кажется, что ваша система насыщена из-за Pageheap.

Вам нужно запустить 500 потоков, чтобы воспроизвести проблему? Может быть, если бы вы могли немного снизить этот показатель, было бы доступно больше ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...