![]() |
|
Модераторы: xvr |
![]()
|
|
| exceilence |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 22.6.2009 Где: Москва Репутация: нет Всего: нет |
Вобщем установлено TCP соединение между клиентом и сервером. Сервер делает close(own_sd) и close(remote_sd) После этого сокет жив и когда товарищ пишит мне в этот сокет, то мой сервер принимает это самое сообщение! и только после этого всё рвётся. Я, конечно, в курсе , что сокет жив пока все не закончат его дрючить и не прочтут всё что могут. У меня один тред читает из сокета. А главная программа закрывает сокет. (у меня - имею в виду у сервера.... хотя и сервер и клиент оба мои.... и вообще это одна и та же программа запускается в 2х экземплярах и стартуются один как сервер а другой как клиент ) ПОЧЕМУ клиент не обрывается на чтении из сокета??? read(sd); Я знаю что SIGPIPE шлётся при попытке писать в мёртвый сокет, а как же клиент узнает при чтении??? И в конце. Когда же я закрываю программу, то клинет вдруг сразу узнает о том что сокет мёртв! А когда я до этого close делал то он притворяется что ему по барабану. Это сообщение отредактировал(а) exceilence - 10.11.2009, 09:18 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
с чего бы это? read() читает данные пока они есть в приемном буфере обычное закрытие сокета приводит к передаче FIN сегмента (возможно даже с данными) и read() возвратит 0 только когда _все_ полученные данные будут прочтены раньше чтения всех данных он может вернуть ошибку, но только, если получен RST сегмент для отслеживания закрытия write-канала на удаленной стороне подойдет poll() + POLLRDHUP -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| exceilence |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
если удаленная сторона вызывает close(), то read() возвратит управление (кроме случая, если TCP пакеты с FIN флагом не доходят до адресата)
а вообще, сумбурно все написано...выдохни проструктурируй мысли ;) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| exceilence |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 22.6.2009 Где: Москва Репутация: нет Всего: нет |
не то слово как сумбурно
код у меня тут такой же мясо-сумбурный Вобщем с одной вещью я покончил. У меня была и остаётся одна функция, которая кончает всех и всяк. То есть сброс к начальному состоянию проограммы. А pthread_cancel нельзя делать из самого треда!!! То есть если тред позвал функцию, которая занимается таким окончанием программы, то тред получается сам себя хочет убрать.... а нельзя. Писать две функции, которые отдельно это всё делают для треда а отдельно для нетреда будет нехорошо. Я завёл быдлофлаг в котором пишу game_over = TRUE и тред когда в очередной раз проверит его поймёт что ему пора заканчивать. Скажу по секрету, я не заметил в куче борохловского своего кода ещё один тред, в котором был accept. Теперь его убиваю по-хорошему pthread_cancel'ом. GTK+ на чистом Си да ещё и руками одними - это не для слабонервных. 1027строк грязи уже. Вобщем не вижу пока ничего неверного в программе и приглядываться не хочу.... работает и ладно. Читателей поста заинтригует что же я пишу??? А это шашки... вот так оболдеть. Притча тем кто ещё не писал шашки --- пишите на плюсах... а то тот ког что я написал так противен. На ++ было бы красота. Ладно. Глаза уже лопаются. Так что я заканчиваю. Если будет что ещё интересного рассказать - отпишусь. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |