На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

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

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> WSAEMFILE исключительно под Wine
    Доброго времени суток!

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

    Фишка в том что и количество слушающих сокетов/потоков и количество создаваемых клиентских строго ограничено константами и сокеты открываются на строго определенных портах - слушающие начиная с X подряд, клиентские начиная с Y или в случае ошибки бинда c Y+100. В случае, если нужно создать "клиентский" сокет, а лимит исчерпан, убивается самый старый (closesocket+closehandle) т.е. тот на который давно не было команд.

    В результате под виндой это уже третьи сутки нормально работает без единой ошибки под достаточно серьезной нагрузкой (чуть меньше 1 запроса в секунду), а запущенный в CentOS под Wine через примерно 6 часов работы летит с ошибкой WSAEMFILE (превышено количество созданных сокетов) на строке RecvFrom в слушающем потоке (при этом нагрузка порядка 1 запроса на 15 секунд).

    Смотрю в netstat -lptu и офигеваю - за этой программой открыто over 400 UDP сокетов, причем порты рандомные в диапазоне 34000-58000, хотя в самой программе сокеты открываются в другом диапазоне чисел. Опять же на винде проверил - открыто с 2 десятка сокетов ровно столько сколько положено согдасно константам. Билд один и тот же. Это особенность Wine или Linux о которой я не знаю? Даже если где не отрабатывается закрытие сокета почему порты не те что надо?
      Перелопатил пол интернета но причины разного поведения в винде и линуксе не нашел.
      Пришлось отказаться от динамического создания потоков и сокетов по мере необходимости, залепил фиксированное число с запасом которые открываются при старте. Больше лишних сокетов не было, почти сутки бесперебойной работы

      не актуально
        Попробуй написать в багтрекер Wine, приложив тестовый проект. Возможно, это баг.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0.0636 ]   [ 15 queries used ]   [ Generated: 24.10.26, 03:03 GMT ]