WSAEMFILE исключительно под Wine
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
WSAEMFILE исключительно под Wine
|
Сообщ.
#1
,
|
|
|
|
Доброго времени суток!
Есть консольное приложение на чистом 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 о которой я не знаю? Даже если где не отрабатывается закрытие сокета почему порты не те что надо? |
|
Сообщ.
#2
,
|
|
|
|
Перелопатил пол интернета но причины разного поведения в винде и линуксе не нашел.
Пришлось отказаться от динамического создания потоков и сокетов по мере необходимости, залепил фиксированное число с запасом которые открываются при старте. Больше лишних сокетов не было, почти сутки бесперебойной работы не актуально |
|
Сообщ.
#3
,
|
|
|
|
Попробуй написать в багтрекер Wine, приложив тестовый проект. Возможно, это баг.
|