22.11.2014 23:56, Ivan Riabtsov пишет:
Поток
нужен, чтобы было чем убить этот поток по таймауту, если вдруг сеть не
работает и recvfrom заблокировалась, если кто-то знает, как это можно
реализовать без потоков, очень хотелось бы послушать.
по поводу блокировки. Работу с сокетами можно рассматривать как как
работу с обычными файловыми дескрипторами.
и к ним можно применять системный вызов select() который является
неблокируемым.
Его, кстати часто используют в реализации серверной части на
сокетах. Так обычно для получения подключения от клиентов
используется вызов accept()
а он блокируемый. И из-за него выход из программы возможен только после
того как клиент подключиться.
Что б этого не происходило используется метод select(), который
выходит либо по приходу данных, либо по пришедшему сигналу (например
SIG_TERM)
Пример использования (первая ссылка в гугле) о том что описал выше.
http://www.gnu.org/software/libc/manual/html_node/Server-Example.html
http://pastebin.com/WqPnGuzw
критиковать не надо, так как это черновая версия, если конечно критика
не глобалная, типа ты вообще все не так сдалал, надо совершенно иначе
:)
Не критика, скорее рекомендации. Есть небольшое нарушение
общепринятого стиля программирования "Код должен легко читаться
сторонним разработчиком". Задействованы глобальные переменные,
которые потом юзаются в двух функциях. Я про эти:
-
int recv_sock, send_sock;
-
struct sockaddr_in
recv_sockaddr, send_sockaddr;
-
struct hostent *h_ent;
Мне как стороннему человеку пришлось дополнительно просматривать
код, что б убедиться что отсутствует потенциальная угроза на
одновременное изменение значений в этих переменных. Поэтому
логичнее было бы:
- эти переменные запихнуть в функцию ping()
- функцию routines() дополнить необходимым параметрами и через них
передать отмеченные выше переменные
Возможно на это другой программист бы и не обратил внимание, но я
связан с преподавательской деятельностью. И за такие недочеты
снижаются оценки по разрабатываемым алгоритмам. Так что искренне
надеюсь что это не воспримите близко. Тем более сами сказали, что
это черновая версия ;)
Код собирать пока не пробовал. так как уже чую что нужно поднимать
документацию что можно было вести диалоги. Остаточных знаний по
спецификации функций уже явно не хватает.
_______________________________________________
Kernel-russian mailing list
Kernel-russian@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernel-russian