Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2010, 09:14   #1
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию winsock и _beginthread

Здравствуйте, система такая: есть консольное приложение, при загрузке из основного потока стартует (_beginthread() ) поток с слушающим тцп сокетом, висит на accept - ждет клиента. Когда стучится клиент пойманный сокет передается в конструктор нового класса, в котором опять же через _beginthread() стартует цикл обработки сообщений из этого сокета. То есть имеем 3 уровня потоков: main, AcceptSocket, Client. И все себе работало тихо мирно... пока в один прекрасный день (после "уборки мусора" ) не началась ересь... сокет в клиентском потоке на обработке сообщений наотрез отказывается ждать, то есть recv не ожидает сообщений, абсолютно, либо отдает уже полученно сообщение, если очередь пуста моментально выдает минус единицу и ошибку
Цитата:
10004 (Interrupted function call.
A blocking operation was interrupted by a call to WSACancelBlockingCall.)
или
Цитата:
10093 (Successful WSAStartup not yet performed.
Either the application has not called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times.
)
ПРОБОВАЛ:
пересобирание и тд пробовалось, из более логичного:
в конструкторе класса клиента просто напрямую запускал процедуру приема сообщений (не новым потоком) - пашет как каштанка, ждет, обрабатывает, снова ждет... запуск в новом потоке после этого выдал те же 10093.
создавался новый сокет в потоке обработки сообщений, удп, байнд вылетает 10093, при прямом запуске из конструктора класса (то есть в аццепт потоке) - норма, слушает, ждет обрабатывает..

уже не знаю что делать... в принципе приложение работало... мы люди не местные, поможите хто чем может
Teksa вне форума Ответить с цитированием
Старый 30.04.2010, 09:59   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Думаю, что ответ кроется во второй цитате. А именно, попробуйте вызывать WSAStartup() в начале каждого потока.

Edit:
На MSDN на прямую об этом не говорят, но говорят, что если надо вызывать WSAStartup() 3 раза (причем можно с разными версиями), то надо и WSACleanup() надо вызывать тоже 3 раза.

Последний раз редактировалось BOBAH13; 30.04.2010 в 10:03.
BOBAH13 вне форума Ответить с цитированием
Старый 30.04.2010, 12:52   #3
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

спасибо) вызов всастартап в каждом потоке решил проблему, хотя странно, в мсднке написано что :" The WSAStartup function initiates use of the Winsock DLL by a process." .
Teksa вне форума Ответить с цитированием
Старый 30.04.2010, 15:02   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Я написал данную "штуку", т.к. были раньше проблемы в GDI+. Так же надо его инициализировать в каждой нити. Вот и подумал что сходны идеи реализации. Ну так написано что инициализирует, все верно.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock profi Win Api 8 11.01.2010 21:13
WinSock Killbrum Win Api 1 18.10.2009 15:15
WinSock.Ошибка 87 AngelOfDeath Работа с сетью в Delphi 1 31.03.2009 10:46
События WinSock telcomp Win Api 1 13.01.2009 09:26
Proxy в WinSock SHEI'TI Работа с сетью в Delphi 3 29.03.2008 18:27