Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.93.34] |
|
Сообщ.
#1
,
|
|
|
Привет всем.
У меня в основном потоке идёт приём сокетов. Потом сокет (как int) кладётся в буфер. А потом берётся из буфера принимающем потоке. При этом в принимающем потоке активно пользуется select (см статью Считывание данных из сокета). И вот что я вижу сегодня: Winsock2 error - 10038. Если проще - то попытка select-ить невалидный сокет. Или вообще не-сокет. Сытранно всё это. closesocket мой процесс не делал. А 4-х байтовый описатель системного ресурса вдруг стал невалидным. Решил подтвердить свою чёрную догадку - проверил на валидность сокета. Действительно - сокет стал инвалидом. И кто это его подрихтовал? Только что живой был, accept-ился нормально, даже в логах запись осталась - вот такой то сокет, принят тогда то, ... , и вдруг :tank: Я бы не очень рассраивался, если бы это произошло 1 раз. Дык происходит каждый (приблизительно) пятый раз. Есть ли у кого нибудь идеи, как защитить моего зверька-сокета от вредных дядей? (хм, возможно, дяди пришли из других процессов, а откуда ещё? - я то ведь closesocket не говорил?!). Спасибо за внимание. |
Сообщ.
#2
,
|
|
|
AQL, а не ты тот самый вредный дядя? Красочное описание канечна хорошо, ты кодом делись....
|
Сообщ.
#3
,
|
|
|
А то что ты подпихиваешь в fd_set, похоже на хэндл сокета или нет?
|
Сообщ.
#4
,
|
|
|
Всё похоже и всё работает. В 80% случаях.
Кстати - код приведён в моей статье в ФАК-е: Считывание данных из сокета.. (там чуть обрезана обработка ошибок). Единственное, чего там нет: это как я accept-ю, но там ошибиться сложно. Потом int кладётся в std::deque() и вынимается принимающим потоком. |
Сообщ.
#5
,
|
|
|
а может кто-то на другой стороне закрыл соединение..
сокет опятьже станет инвалидным т.к. пришло сообщение FD_CLOSE от другой стороны.. то, что ты его не закрывал вручную ещё ни о чем не говорит.. |
Сообщ.
#6
,
|
|
|
Цитата Muran, 24.05.04, 17:40 а может кто-то на другой стороне закрыл соединение хэндл сокета в этом случае должен жить |