У меня есть приложение, которое использует winsock.
Часть ввода / вывода обрабатывается в другом потоке.
И я использую метод выбора блокировки для сокетов.
Но дело в том, что через 5-6 часов мое приложение выдает исключение 0xC00000FD в строке функции выбора.
Насколько я знаю, это исключение возникает, когда есть рекурсия или очень большие локальные переменные. Но ни один из них не относится ко мне.
Так у вас есть идеи, почему я получаю это исключение?
Или есть идеи, чтобы узнать, что на самом деле вызывает исключение?
большое спасибо
РЕДАКТИРОВАТЬ 2:
Уважаемые все, мне очень жаль, но поскольку воспроизведение дела занимает много времени, я просто понял, что это не решило проблему.
Все выглядит нормально, когда в строке функции select возникает исключение переполнения стека.
Я имею в виду, что это сокет сервера с одним подключенным клиентом. Таким образом, есть 2 сокета в rset и 1 в wset. После выбора проверяю все готовые розетки и делаю необходимые, читаю, пишу, принимаю. Тайм-аут составляет 250 мс. Как вы думаете, может ли это быть проблемой? Я не хочу, чтобы эта функция блокировала, поэтому она не равна нулю. Но какая будет точная разница, если я буду использовать {0,0}
Важный совет:
Тот же код работал без проблем, когда клиентский сокет не отправлял никаких данных.
Но когда я начал отправлять некоторые данные с клиента на сервер, возникла эта проблема.
Я уверен, что нет проблем с FD_SET и FD_CLR, я имею в виду, когда клиент не отправлял, только 1 (сервер) сокет был в rset, а 1 (клиент) был в wset.
Во всяком случае, я посмотрел много образцов, но, похоже, разницы нет.
Пожалуйста, смотрите скриншот с локальными переменными ниже (я удалил имя исполняемого файла, так как это коммерческий продукт)
http://img192.imageshack.us/img192/1948/stackoverflow.jpg
А вот и стек вызовов:
ntdll.dll! 7c90df3a ()
[Кадры ниже могут быть неправильными и / или отсутствующими, символы не загружены для ntdll.dll]
mswsock.dll! 71a53c9c ()
ntdll.dll! 7c90d26c ()
mswsock.dll! 71a55f9f ()
mswsock.dll! 71a55974 ()
ws2_32.dll! 71ab314f ()
xyz.exe! Vm_socket_select (vm_socket * hds = 0x04c1fb84, int nhd = 1, int mask = 7) Строка 230 + 0x1b байтов C
xyz.exe! ND :: nd_socket :: SocketThreadProc () Строка 173 + 0x12 байт C ++
xyz.exe! ND :: nd_socket :: ThreadRoutineStarter (void * u = 0x07d63f90) Строка 332 C ++
xyz.exe! _callthreadstartex () Строка 348 + 0x6 байт C
xyz.exe! _threadstartex (void * ptd = 0x011a3ce8) Строка 326 + 0x5 байт C
kernel32.dll! 7c80b713 ()
Жду любых советов.
Большое спасибо