| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Закрытие сокета и реакцтия |
| Автор: exceilence 10.11.2009, 09:16 |
Вобщем установлено TCP соединение между клиентом и сервером. Сервер делает close(own_sd) и close(remote_sd) После этого сокет жив и когда товарищ пишит мне в этот сокет, то мой сервер принимает это самое сообщение! и только после этого всё рвётся. Я, конечно, в курсе , что сокет жив пока все не закончат его дрючить и не прочтут всё что могут. У меня один тред читает из сокета. А главная программа закрывает сокет. (у меня - имею в виду у сервера.... хотя и сервер и клиент оба мои.... и вообще это одна и та же программа запускается в 2х экземплярах и стартуются один как сервер а другой как клиент ) ПОЧЕМУ клиент не обрывается на чтении из сокета??? read(sd); Я знаю что SIGPIPE шлётся при попытке писать в мёртвый сокет, а как же клиент узнает при чтении??? И в конце. Когда же я закрываю программу, то клинет вдруг сразу узнает о том что сокет мёртв! А когда я до этого close делал то он притворяется что ему по барабану. |
| Автор: MAKCim 10.11.2009, 09:43 |
с чего бы это? read() читает данные пока они есть в приемном буфере обычное закрытие сокета приводит к передаче FIN сегмента (возможно даже с данными) и read() возвратит 0 только когда _все_ полученные данные будут прочтены раньше чтения всех данных он может вернуть ошибку, но только, если получен RST сегмент для отслеживания закрытия write-канала на удаленной стороне подойдет poll() + POLLRDHUP |
| Автор: exceilence 10.11.2009, 19:25 |
| Что можно такое сделать, чтобы read(sd) ожил и понял, что надо кончать ожидание? Сейчас я даже не могу своему собственному треду сказать, что, "петух, пора просыпаться". В программе пишу close(sd). А рядом тред спит на read(sd). Можно ли как-то read оборвать, не присылая туда специалльное сообщение текстовое??? В http протоколе два переноса на новую строку были, сигнализирующих об окончании. У меня клиент с сервером обмениваются саквояжем с данными определенного формата (структуркой) Или придётся просто отослать перед закрытием структуры с ноликами? bzero(моя_структура) Похоже это единственный выход. ------------------------------- Если же accept оборвать надо, то с ним ещё тяжелее - ему подсунуть текст с нулями нельзя! Пример из жизни: Стартанул я сервер - тред повис на аксепте.... нажал я кнопку "Отмена" - закрылся сокет close'ом. А аксепт висит. ------------------------------- Аксепт можно снять если под корень тред его срубить..... пока не удалось убить тред.pthread_cancel pthread_exit не могут это сделать.... других заклинаний не нашёл для отрубки треда |
| Автор: MAKCim 10.11.2009, 21:50 |
| если удаленная сторона вызывает close(), то read() возвратит управление (кроме случая, если TCP пакеты с FIN флагом не доходят до адресата) а вообще, сумбурно все написано...выдохни проструктурируй мысли ;) |
| Автор: exceilence 10.11.2009, 22:37 |
| не то слово как сумбурно код у меня тут такой же мясо-сумбурный Вобщем с одной вещью я покончил. У меня была и остаётся одна функция, которая кончает всех и всяк. То есть сброс к начальному состоянию проограммы. А pthread_cancel нельзя делать из самого треда!!! То есть если тред позвал функцию, которая занимается таким окончанием программы, то тред получается сам себя хочет убрать.... а нельзя. Писать две функции, которые отдельно это всё делают для треда а отдельно для нетреда будет нехорошо. Я завёл быдлофлаг в котором пишу game_over = TRUE и тред когда в очередной раз проверит его поймёт что ему пора заканчивать. Скажу по секрету, я не заметил в куче борохловского своего кода ещё один тред, в котором был accept. Теперь его убиваю по-хорошему pthread_cancel'ом. GTK+ на чистом Си да ещё и руками одними - это не для слабонервных. 1027строк грязи уже. Вобщем не вижу пока ничего неверного в программе и приглядываться не хочу.... работает и ладно. Читателей поста заинтригует что же я пишу??? А это шашки... вот так оболдеть. Притча тем кто ещё не писал шашки --- пишите на плюсах... а то тот ког что я написал так противен. На ++ было бы красота. Ладно. Глаза уже лопаются. Так что я заканчиваю. Если будет что ещё интересного рассказать - отпишусь. |