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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2011, 22:12   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию boost::thread и CreateThread

Доброго времени суток. Имеется сервер, в котором для работы с каждым вновь приконнектившимся клиентом создается отдельный поток
Код:
listen( server, SOMAXCONN );

while(exit != true)
{
SOCKET client = accept( server, (struct sockaddr *)&sin, &length );
  		      
hThread=CreateThread(NULL,0,ProcessClient,(void *)&client,0,&dwThreadId);
}
При этом все отлично работает. Работа с клиентом происходит в отдельном потоке, а родитель в это время коннектит следующего клиента.
Пытаюсь реализовать с использованием boost.
Код:
boost::asio::io_service ioService;

tcp::acceptor acceptor(ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));

acceptor.listen(boost::asio::socket_base::max_connections);

while(Serv.GetStopFlag() == CONTINUE)
{
tcp::socket *sock = new tcp::socket(ioService);

acceptor.accept(*sock);  

boost::thread hThread(boost::bind(&Server<Client>::Work,  sock));
}
При этом от клиента принимается только первый пакет и вылетает ошибка Bad file descriptor. Если добавить
Код:
 hThread.join()
То сервер ждет пока текущий клиент закончит работу и только после этого подключает следующего. Подскажите как подправить прогу, чтобы она работала аналогично первому случаю.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 09.10.2011, 11:49   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

ну очевидно что hThread.join() здесь не нужен, так как этот метод ждёт пока поток не завершится

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
При этом от клиента принимается только первый пакет и вылетает ошибка Bad file descriptor.
очевидно что переменная с хендлом сокета где-то изменяется/обнуляется, либо вообще в ней ерунда

sock это всего указатель на tcp::socket, мы передаём данный указатель потоку и сразу же в следующей итерации цикла мы её обновляем
Цитата:
tcp::socket *sock = new tcp::socket(ioService);
вот как-то так...
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии

Последний раз редактировалось haruhi; 09.10.2011 в 12:12.
haruhi вне форума Ответить с цитированием
Старый 09.10.2011, 12:59   #3
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

вместо CreateThread также стоит использовать _beginthreadex
alex_x_x вне форума Ответить с цитированием
Старый 09.10.2011, 18:01   #4
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
очевидно что переменная с хендлом сокета где-то изменяется/обнуляется, либо вообще в ней ерунда
Так и было. Сделал в функции, выполняющейся в потоке копирование sock в переменную, и все заработало. Спасибо haruhi
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateThread() в C# и поиск в текстовом файле artlayers Помощь студентам 0 18.06.2010 18:09
Функция CreateThread в Visual C++ 2008 Muxeu Общие вопросы C/C++ 0 03.06.2010 11:43
Поставить CreateThread в нужное место Sam Gold C/C++ Сетевое программирование 4 20.05.2010 23:46
Boost (asio + thread) - noncopyable MInner Общие вопросы C/C++ 1 06.12.2009 16:41