LINUX.ORG.RU

Сообщения nyka

 

Пенсионный возраст в IT

Форум — Talks

Часто слышу что 33-36 это возраст пенсионера в IT

Что можно делать такое в 25, чего уже нельзя делать в 35?
Есть ли разница, например, у сиплюсников и верстальщиков CSS?

Хотелось бы услашать ваше мнение

 , , , ,

nyka
()

Протектор исполняемых файлов

Форум — Development

Под винду есть куча всяких протекторов и прочего что может оттянуть момент написания кряка. Есть ли действительно годные линуксовые решения?
интерес академический

 , , ,

nyka
()

Apache mod_ssl. Получить параметры из «Client Hello»

Форум — Development

Пользователь приходит по https на апач, нужно получить параметры передаваемые в пакете «Client Hello».

Получить версию протокола получилось, код добавила в месте где уже понятно что пакет клиент_хэллоу получен (https://github.com/apache/httpd/blob/7d4c0f0eceab1dbd3fd1237e9f0b3fe9c8914861...)

    char ssl_protocol_version_code_str[16];
    sprintf(ssl_protocol_version_code_str, "%d", SSL_version(ssl));

    //Добавляем переменную в php $_SERVER
    apr_table_set(env, "EXTENTED_SSL_PROTOCOL_VERSION_CODE", ssl_protocol_version_code_str);
А вот получить список предлагаемых клиентом наборов шифрования, расширений, id сессии и пр не удается. Все семейство функций для работы с ClientHello (SSL_client_hello_get0_ciphers(), SSL_client_hello_get0_session_id и пр) возвращают нулевое значение.
В месте в котором вызываются функции пакет уже принят, я проверила тем что получила список поддерживаемых сервером методов шифрования из тех что предложил клиент с помощью SSL_get_client_ciphers().

Как заставить работать семейство функций SSL_client_hello?

 , , ,

nyka
()

Получить пакет https «Client Hello» в php-apache

Форум — General

Клиенты приходят на апач по https. В php-модуле нужно получить, да хоть в бинарном виде, пакет «Client Hello», либо как-то получить поддерживаемые клиентом криптографические наборы, расширения и методы компрессии.

Как такое устроить?

 , , ,

nyka
()

Имя метода совпадает с именем библиотечной функции

Форум — Development

Унаследовалась от класса в котором есть публичные методы CClassname::read и CClassname::write. Есть какой-нибудь способ обратиться к библиотечным read и write? Очень не хочется лезть в чужой код

 , , ,

nyka
()

splice+pipe=EAGAIN

Форум — Development

Добрый день

Делаю сплайс из неблокируемого сокета в пайп.
Псевдокод:


if(pipe(splice_pipe) < 0)
	{
		perror("pipe");
		return -1;
	}

pipe_size = fcntl(splice_pipe[0], F_GETPIPE_SZ))
...................
//При событии поступления данных на сокет
if((read = splice(
			sock_fd,
			NULL,
			splice_pipe[1],
			NULL,
			pipe_size - pipe_bytes_num,
			SPLICE_F_MOVE|SPLICE_F_NONBLOCK
			)) <0)
{
  perror("splice");
  return -1;
}

pipe_bytes_num += read;

Размер пайпа 65536 байт. При попытке заполнить пайп полностью splice выдает EAGAIN.
Ради шалости попробовала заведомо уменьшить на килобайт-другой значение переменной pipe_size чтобы не заполнять подзавязку - не дает результата. А вот если уменьншить pipe_size килобайт на 20, то EAGAIN не выскакивает.
Лишний пустой вызов splice очень напрягает, особенно часто это может быть если медленный читатель из пайпа, а писатель очень быстрый.

Код не могу привести полностью из-за размазанности по проекту.
Откуда берется EAGAIN, если допустить что в коде нет попыток переполнения пайпа и в буфере сокета есть данные?

 ,

nyka
()

queue+spinlock или ядерная очередь?

Форум — Development

Из одного потока в другой нужно организовать очередь. Один писатель и один читатель. Рассматриваю варианты <queue>+spinlock или ядерную очередь.
Спинлок вроде быстр, но будет топить проц ждущим потоком
Ядерная очередь это передача данных через само ядро, но событие на очереди можно отлавливать с пом того же epoll, что очень удобно

Что думаете?

 ,

nyka
()

Клиент-серверное ПО. Модель управления соединениями.

Форум — Development

Пишу тз для клиент-серверного приложения и есть дилемма при выборе модели управления соединениями.

Между приложением и сервером должны передаваться данные и команды. Данные представляют собой бинарный поток неизвестной длины и не имеют признака окончания и проще всего завершать соединение как признак конца передаваемых данных.

Команды представляют собой структурированные данные известной длины. после их передачи соединение завершать не нужно.

Для приложения критичен онлайн клиента.

Варианты:

1) Приложение создает соединение с сервером, данные передаются, соединение закрывается. Как только данные начинают передаваться, создается пулл таких соединений для того чтобы избежать задержек на создание нового соединения когда оно понадобится.

Минусы:
a) может так случиться что первое соединение закрыто, а новые соединения еще не созданы (еще только создаются). Сервер видит что нет ниодного соединения и читает что клиент в оффе и на сервере придется пилить костыли чтобы обработать это. Даже если создавать больше 1 соединения первоначально, то неисключено что эти соединения будут завершены прежде чем будет создано хотябы 1 новое.

b) Данные и команды придется передавать по одним и тем же соединениям. Нужно устанавливать какие-то приоритеты(???)

2) Разделяем соединения на типы: 1 командное которое будет ВСЕГДА онлайн пока приложение онлайн и остальные соединения только для передачи данных. Политика работы с соединениями для передачи данных такая же как и в 1) По командному соединению, соответственно, передаем команды.

Минусы: создаем дополнительное соединение которое будет занимать ресурсы сервера

-------------------------------------------------------------
Есть экзотические варианты, но там совсем уж...

Какую модель используют на практике?
Какие подводные камни?
Хотелось бы критики

 , ,

nyka
()

Шифрование трафика и идентификация сервера

Форум — Development

Данные передаваемые между клиентом и сервером представляют собой некоторую коммерческую ценность, но никак не шифруются. Кроме того, клиент никак не идентифицирует сервер и это дает простор для разнообразных атак (типа синкхола и снифа).
Нужно выбрать (или разработать???) методы идентификации сервера клиентом и шифрования передаваемых данных по сети.

С чего правильно начать выбор методов?
Какие подводные камни?

 , ,

nyka
()

Макроопределения и отладочный вывод в C++. Когда очень хочется

Форум — Development

Страуструп в своей книге «С++ принципы и практика» откровенно не рекомендует использовать макроопределения из-за возможных сложностей в отладке и пр, но много лет практики на С берут свое и очень хочется сделать что-то типа

#ifndef DEBUG
#define DEBUG
    printf(...);
#endif
Но я бы не хотела включать таким образом отладочный вывод во всех методах, значит придется делать для каждого метода свой DEBUG, а потом инициализировать их перед сборкой проекта...

Хотелось бы узнать как «правильно» выводить отладочную информацию без ущерба читаемости и производительности. Гуглила логгеры и нашла просто монстров на гитхабе и в каких-то обзорах. Хотелось бы услышать мнение и инструменты кто чем пользуется

 , ,

nyka
()

Подружить epoll_wait с gdb

Форум — Development

При отладке epoll_wait возвращает -1 независимо от того есть событи на сокетах или нет. Нагуглила костыль

do {
    events_num = epoll_wait(epoll_fd, events, num, -1);
} while(events_num < 0 && errno == EINTR);
не работает, просто впадает в бесконечный цикл.
Может я что-то делаю не так?

 ,

nyka
()

Не все сисколы одинаково тяжелы?

Форум — Development

Сетевой сервер при каждой операции чтения/записи в сокет делает метку времени и регулярно проходится по массиву соединений в поисках тех которые нужно отвалить по таймауту.
Каждый раз приходится получать время вызывая time() и это натолкнуло на мысль что 2 сискола за раз это как-то накладно.
Возникла идея запустить отдельный поток в котором несколько раз в секунду будет получаться время и писаться в переменную. Переменную закрыть мьютексами, а из рабочего потока считывать значение по необходимости.

Вопрос следующий: а не перекроют ли все полученные выгоды расходы на работу с мьютексами?

 , ,

nyka
()

2 байта в буфер отправки сокета

Форум — Development

Может ли send при записи 2-х байт в заведомо пустой буфер отправки неблокируемого сокета записать 1 байт?
Все в штатном режме и без ошибок.

 , ,

nyka
()

Ограничение скорости передачи данных на lo

Форум — Admin

Для отладки сервера нужна мизерная скорость передачи данных в 1 байт в секунду на локальном интерфейсе.
Посмотрела маны по tc и ужаснулась тому что плаваю в вопросе) Если кто может, дайте строчку команды.
Спасибо

 , ,

nyka
()

Тестирование сетевого демона

Форум — Development

Хотелось бы протестировать серверный софт. Для тестов написан клиент, но тестировать на loopback как-то несерьезно. Нужны обрывы, ошибки передачи данных, рандомные таймауты, фрагментация данных при отправке и получении и прочее.

Создавать такие условия как-то накладно и хотелось бы эмулировать такую «реальность».

Это возможно?

 

nyka
()

Сокеты, мультиплекирование и ветвистые протоколы

Форум — Development

Очень нужна критика, ощущение велосипедостроения

***Далее, сокеты неблокируемые, мультиплексируем с пом epoll (тут непринципиально)

В процессе обмена данными между клиентом и сервером размеры пакетов данных заранее неизвестны (указываются в самих пакетах), пакеты приходится разберать «налету», дочитывать из сокета требуемое колво-данных и возвращаться к прежнему состоянию протокола.

Алгоритм протокола я разбила на этапы каждый из которых завершается тем что нужно вычитать/отправить еще данных из сокета и возврат к ожиданию события EPOLLIN/EPOLLOUT.

Схематично:

//Сам протокол
protocol_stage_t protocol(protocol_stage_t stage)
{

	if(stage_1)
	{
		//Какой-то алгоритм
		...
		//Если нужно получить/отправить данные, запоминаем состояние протокола и выходим
	}

	if(stage_2)
	{
		//Какой-то алгоритм
		...
		//Если нужно получить/отправить данные, запоминаем состояние протокола и выходим
	}
	
	....
}

//Ожидаем события
void event_loop()
{

	//Если пришли данные
	if(EPOLLIN)
	{
		...
		//Восстанавливаем состоние протокола для клиента и продолжаем выполнение
		...
		last_stage = protocol(saved_protocol_state);

		//Запоминаем где-то состояние протокола на котор остановились
		...
	}


	//Если ушли данные
	if(EPOLLOUT)
	{
		...
		//Восстанавливаем состоние протокола для клиента и продолжаем выполнение
		...
		last_stage = protocol(saved_protocol_state);

		//Запоминаем где-то состояние протокола на котор остановились
		...
	}
}
Очень нужна криптика такого подхода и желательно советы.
Возможно, такие подходы уже реализованы в каких-то библиотеках, но я о них не знаю.

 ,

nyka
()

Debian XFCE на маломощный ноут

Форум — Linux-install

Есть маломощный нетбук, попробовала Debian 8 XFCE

Слышала что команда XFCE малочисленна и они затягивают с обновами, в том числе и с критическими

Я не большая специалистка в области всякоразных дистрибутивов и репозиториев, поэтому возникает вопрос:

Если я использую Debian+XFCE и выпущено какое-то обновление для ядра, то это обновление выпускается для всех сред рабочего стола Debian независимо от среды рабочего стола?

Спасибо

 , ,

nyka
()

Получить параметры командной строки запущенного процесса

Форум — Admin

Добрый день

Есть пачка запущенных процессов парметры которых нужно получить.
Все осложняется тем что в параметрах могут быть строки содержащие пробельные символы, поэтому читать /proc/$PID/cmdline неверно.
К примеру, если строка запуска следующая:

./script.sh --any-string-param '   any string value for --any-string-param   '
то понятно что в /proc/$PID/cmdline будет строчка которая не даст понимание что есть параметр а что есть значение.

Как быть?
Спасибо

 , , , ,

nyka
()

ASN.1 PER сериализация

Форум — Development

Добрый вечер

Приходит строчка в ASN.1 PER, надо ее десериализовать/распарсить/распаковать...
Известны типы данных которые могут быть упакованы
Языки С/С++/Java

Гугл говорил о компиляторах, чудовищних стандартах...

Что посоветуете?

 , , ,

nyka
()

Вызов метода Java-класса из PHP. Возможно ли?

Форум — Web-development

Добрый вечер

Есть исходники класса на Java со всякими страшными вычислениями и подобной бинарщиной. И есть скрипт на PHP из которого ну очень нужно вызывать методы класса на Java.
Разбираться в исходниках класса на Java и переписывать совсем антивариант, код класса писался «для машины, а не человека».

Как вызвать одно из другого?

Спасибо

 ,

nyka
()

RSS подписка на новые темы