Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрытие сокета и реакцтия 
:(
    Опции темы
exceilence
Дата 10.11.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет




Вобщем установлено TCP соединение между клиентом и сервером.
Сервер делает close(own_sd)   и   close(remote_sd)

После этого сокет жив и когда товарищ пишит мне в этот сокет, то мой сервер принимает это самое сообщение!   и только после этого всё рвётся.
Я, конечно, в курсе , что сокет жив пока все не закончат его дрючить и не прочтут всё что могут.


У меня один тред читает из сокета. А главная программа закрывает сокет. (у меня - имею в виду у сервера....  хотя и сервер и клиент оба мои.... и вообще это одна и та же программа запускается в 2х экземплярах и стартуются один как сервер а другой как клиент )

ПОЧЕМУ клиент не обрывается на чтении из сокета???   read(sd);

Я знаю что SIGPIPE шлётся при попытке писать в мёртвый сокет, а как же клиент узнает при чтении???


И в конце. Когда же я закрываю программу, то клинет вдруг сразу узнает о том что сокет мёртв!

А когда я до этого close делал то он притворяется что ему по барабану.


Это сообщение отредактировал(а) exceilence - 10.11.2009, 09:18
PM MAIL   Вверх
MAKCim
Дата 10.11.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(exceilence @  10.11.2009,  09:16 Найти цитируемый пост)
ПОЧЕМУ клиент не обрывается на чтении из сокета??? 

с чего бы это?
read() читает данные пока они есть в приемном буфере
обычное закрытие сокета приводит к передаче FIN сегмента (возможно даже с данными)
и read() возвратит 0 только когда _все_ полученные данные будут прочтены
раньше чтения всех данных он может вернуть ошибку, но только, если получен RST сегмент
для отслеживания закрытия write-канала на удаленной стороне подойдет poll() + POLLRDHUP


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
exceilence
Дата 10.11.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



Что можно такое сделать, чтобы read(sd) ожил и понял, что надо кончать ожидание?

Сейчас я даже не могу своему собственному треду сказать, что, "петух, пора просыпаться".

В программе пишу close(sd).  А рядом тред спит на read(sd).   


Можно ли как-то read оборвать, не присылая туда специалльное сообщение текстовое???

В http протоколе два переноса на новую строку были, сигнализирующих об окончании.

У меня клиент с сервером обмениваются саквояжем с данными определенного формата (структуркой)




Или придётся просто отослать перед закрытием структуры с ноликами?   bzero(моя_структура)
Похоже это единственный выход.

-------------------------------
Если же accept оборвать надо, то с ним ещё тяжелее - ему подсунуть текст с нулями нельзя!

Пример из жизни: Стартанул я сервер - тред повис на аксепте.... нажал я кнопку "Отмена" - закрылся сокет close'ом. А аксепт висит.
-------------------------------
Аксепт можно снять если под корень тред его срубить.....  пока не удалось убить тред.pthread_cancel pthread_exit  не могут это сделать.... других   заклинаний не нашёл  для отрубки треда



 




Это сообщение отредактировал(а) exceilence - 10.11.2009, 21:27
PM MAIL   Вверх
MAKCim
Дата 10.11.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



если удаленная сторона вызывает close(), то read() возвратит управление (кроме случая, если TCP пакеты с FIN флагом не доходят до адресата)

а вообще, сумбурно все написано...выдохни проструктурируй мысли ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
exceilence
Дата 10.11.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 22.6.2009
Где: Москва

Репутация: нет
Всего: нет



не то слово как сумбурно

код у меня тут такой же мясо-сумбурный

Вобщем с одной вещью я покончил. У меня была и остаётся одна функция, которая кончает всех и всяк. То есть сброс к начальному состоянию проограммы. А pthread_cancel нельзя делать из самого треда!!!   То есть если тред позвал функцию, которая занимается таким окончанием программы, то тред получается сам себя хочет убрать.... а нельзя.

Писать две функции, которые отдельно это всё делают для треда а отдельно для нетреда будет нехорошо.
Я завёл быдлофлаг в котором пишу game_over = TRUE и тред когда в очередной раз проверит его поймёт что ему пора заканчивать.



Скажу по секрету, я не заметил в куче борохловского своего кода ещё один тред, в котором был accept. Теперь его убиваю по-хорошему pthread_cancel'ом.



GTK+ на чистом Си да ещё и руками одними - это не для слабонервных.  1027строк грязи уже.


Вобщем не вижу пока ничего неверного в программе и приглядываться не хочу....  работает и ладно. 

Читателей поста заинтригует что же я пишу???   А это шашки... вот так оболдеть. Притча тем кто ещё не писал шашки --- пишите на плюсах... а то тот ког что я написал так противен.   На ++ было бы красота.


Ладно. Глаза уже лопаются. Так что я заканчиваю. Если будет что ещё интересного рассказать - отпишусь.



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.