Всем доброго вечера! Делаю вот так: Код (Text): FD_ZERO(&fdsRead); FD_ZERO(&fdsWrite); FD_SET(listener,&fdsRead); for(playerIndex=0;playerIndex<players.size();playerIndex++) { FD_SET(players[playerIndex].entitySocket,&fdsRead); FD_SET(players[playerIndex].entitySocket,&fdsWrite); } selectResult=select(0,&fdsRead,&fdsWrite,0,&timeValue); Когда нет клиентов, то есть выполняется только для слушающего сокета listener, то ошибок нет. Вот подключился клиент и уже его сокет берётся из players. Функция select() возвращает ошибку, что я пытаюсь выполнить операцию не над сокетом. Проверяю в режиме отладки. accept() возвращает тот же номер сокета, что я ложу в fdsRead с fdsWrite. Тогда в чём же дело?
Разобрался сам. Получалось что добавление нового экземпляра в вектор, вызывался конструктор копирования и после срабатывал деструктор, в котором вызывалось closesocket().
вектор+хранение по значению = меняюшиеся индексы, битые указатели, боль... Лучше сразу отдели игровую логику от сетевой части и свяжи через идентификаторы. Вектор замени на map<ID,Player*>, будешь по id сообшения не только от сети получать но и от других подсистем. Вообше, для игры использовать tcp не тру, если конечно ты не пошаговую пишешь или поинтклик ... омеге ты пишешь мморпг ? )))