Функция Winsock Select() выдает исключение 0xC00000FD

У меня есть сервер на основе select. Сокеты находятся в режиме блокировки, но для функции select() я использую 250 мс. тайм-аут.

В основном мой сервер принимает только одного клиента и отправляет данные этому клиенту. Он работает неделями без проблем, если я просто отправляю данные с сервера на клиент.

Но я понял, что если клиент отправляет данные на сервер через 3-4 часа в строке select(), это дает исключение переполнения стека (0xC00000FD). Я десятки раз просматривал MSDN-страницу Select(), но об этом ничего не упоминалось. Я действительно застрял. Любая помощь будет оценена.

Кстати, нашел в сети, пример;

http://tangentsoft.net/wskfaq/examples/basics/select-server.cpp

здесь, приняв соединение с клиентом, он устанавливает его в неблокирующий режим. И это прокомментировано;

 // Mark the socket as non-blocking, for safety.

Что означает «безопасность» выше? Так ты думаешь, это моя проблема? Потому что в моей реализации подключенные находятся в режиме блокировки?

заранее спасибо


person AFgone    schedule 04.06.2010    source источник


Ответы (1)


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

person Remy Lebeau    schedule 04.06.2010
comment
Привет Реми, спасибо за ваш ответ. Но дело в том, что есть цикл, который опрашивает вызов select(). Таким образом, нет рекурсивных вызовов функций. И если клиент не отправляет никаких данных, то проблем точно нет. Но если он отправляет данные, через 4-5 часов он дает переполнение буфера в функции select(). если это поможет, я могу опубликовать псевдокод? - person AFgone; 08.06.2010
comment
Тогда маловероятно, что вы получаете переполнение стека. Переполнение буфера — это нечто совершенно другое. Это действительно звучит так, как будто вы неправильно управляете своим кодом в любом случае. Так что да, пожалуйста, покажите реальный код. - person Remy Lebeau; 09.06.2010