Рализация Multithreaded CSocket - одни вопросы???
От: Finder  
Дата: 30.12.02 10:23
Оценка:
Собственно, сабж. Куча клиентов чего-то спрашивают у сервера, он им чего-то отвечает. Певроначально сервер сделал как консольное приложение с поддержкой одного канала: listen(), accept() — новый сокет, канал отработал, убил, ждем нового соединения. И все работало прекрасно, пока не перешел к следующему шагу: добавить многопоточность (она же многоканальность . После accept() создаю отдельную нитку, в которой и выполняется общение сервера с клиентом. Сервер в это время снова listen(). Однако такой вариант отказывается работать: из недр sockcore.cpp стал вылетать ASSERT(pState->m_hSocketWindow != NULL); Попытался разобраться... и окончательно запутался:
При каждом send()/receive() вызывается одноименный метод CAsyncSocket и если вдруг он возвращает ошибку WSAEWOULDBLOCK CSocket пытается слать мессаги PumpMessage(). Как показала отладка, такая же ситуация бывает и в старой однопоточной версии, но там хэндл окна не пустой (и ассерт не вылазит).
Отсюда два вопроса:
1. CSocket — блокирующий, а в MSDN сказано, что ошибка WSAEWOULDBLOCK возникает, если сокет помечен как неблокирующий и receive() хочет его заблокировать. Не понял, почему эта ошибка вообще возникает...
2. Почему при запуске поддержки соединения в отдельном потоке (AfxBeginThread) хэндл окна оказывается нулевой (откуда он там вообще появляется) и слетает PumpMessage() и как это победить? Кстати, на кой вообще мне нужен этот PumpMessage()?
P.S. Я понимаю, что я многого не понимаю...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.