Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

пятница, 29 марта 2013 г.

Послать самому себе пакет данных через сеть

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


Предположил что у нас есть 2 сетевых карты, а следовательно и два сетевых интерфейса:
  - eth0 ip 192.168.10.1
  - eth1 ip 192.168.10.2


 Для начала, я попробовал решить эту задачу самым простым(и первым) способом пришедшим мне в голову. Создать сокет и привязать его к сетевому интерфейсу eth0(192.168.10.1) и посылать пакеты на 192.168.10.2. Но как оказалось так просто ядро Linux не провести, показания ifconfig говорили что пакету идут через сетевую петлю lo.

После продолжительного поиска я наткнулся на патч для ядра от Julian Anastasov(не стал пытаться переводить на русский, вдруг ошибусь) Send-To-Self interface flag. Который позволял отправлять самому себе пакеты через внешнюю сеть. Автор постоянно обновляет этот патч. Основными преимуществами заявленными автором являются:
  - данная фича может быть использована любыми приложениями без изменения кода
  - фича не ограничивается 2 интерфейсами
  - фичу можно использовать с несколькими IP адресами
  - фича не зависит от состояний rp_filter'a и arp_filter'a
  - подробней и остальное тут

Что удобно в пропатченном ядре функция такой маршрутизации включается и отключается на лету из userspace'a. Вот так:


# Включаем
echo 1 > /proc/sys/net/ipv4/conf/eth0/loop 
# Выключаем
echo 0 > /proc/sys/net/ipv4/conf/eth0/loop

понедельник, 19 ноября 2012 г.

qBittorrent замена uTorrent

Не для кого не секрет что uTorrent с каждой новой версией превращается в УГ. В поисках замены наткнулся на эту замечательную программу.

Основное преимущество (для меня)qBittorrent перед другими клиентами, это сходство интерфейса с uTorrent,  кросс - платформенность  т.к. я являюсь обладателем  небольшого зоопарка ОС и открытость исходных кодов. Немного информации с сайта:




  • Интерфейс схожий с uTorrent
  • Хорошо интегрированные и гибкие плагины поиска
    • Поиск по самым популярным BitTorrent базам(поисковикам)
  • Доступны все расширения протока Bittorrent
    • DHT, Peer Exchange, Full encryption, Magnet/BitComet URIs, ...
  • Удаленное управление по средствам веб-интерфейса
  • Расширенный контроль над трекерами, пирами и торрентами
  • UPnP / NAT-PMP поддержка перенаправления портов
  • Доступен на ~25 языках (поддержка Unicode)
  • Наличия инструмента для создания торрентов
  • Продвинутая поддержка RSS с фильтрами (включая regex)
  • Планировщик ширины канала
  • IP фильтр (совместимый с eMule и PeerGuardian)
  • IPv6 совместимый
  • Последовательная загрузка (aka "Загрузка по порядку")
  • Работает на следующих платформах: Linux, Mac OS X, Windows, OS/2, FreeBSD
В целом программа отличная, а ее открытость позволяет добавлять нехватающие фичи, чем в принципе я время от времени и занимаюсь! Кстати написанна он на Qt.

Так же стоит отметить наличие web-интерфейса и возможность программы работать на ОС(Linux), без оконного менеджера. Так что при помощи этой программы можно построить домашнюю торрента-качалку на отдельном сервере и управлять ей удаленно через веб-интерфейс.

qBittorrent имеет встроенный торрент-трекер, что позволит раздавать торренты людям непосредственно с своего компа, без выкладывания торрента на интернет трекеры.

понедельник, 20 августа 2012 г.

Работа с git через прокси

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


Но этот способ так и не заработал для меня, зато сработала команда для конфигурации git:

git config --global http.proxy http://login:'pa$$word'@proxyhttp:8080

одинарные кавычки обязательны. Теперь хоть git работает!

пятница, 20 июля 2012 г.

Таймеры высокого разрешения Linux C/C++

В операционной системе Linux помимо обычных задержек(sleep) и таймеров, реализованы таймеры высокого разрешения. Таймер и задержки высокого разрешения позволяет измерять временные промежутки с точностью до наносекунд, а так же позволяют приложения "засыпать" на непродолжительное время(в зависимости от конфигурации системы) соизмеримое с несколькими микросекундами.



//===============================================================
// Name        : HiTimer.c
// Author      : D.Falko
// Version     : 1.0
// Description : High Resolution timer test
//===============================================================
 
 
#include <stdio.h>
#include <time.h>
#include <sched.h>
#include <string.h>
#include <sys/mman.h>
#include <limits.h>
 
 
int main(int argc, char *argv[])
{
    if(0 == geteuid()) // приложение должно быть запущенно с правами суперпользователя
    {
        struct sched_param sp;
        memset(&sp, 0, sizeof(sp));
        sp.__sched_priority = sched_get_priority_max(SCHED_FIFO);
        sched_setscheduler(0, SCHED_FIFO, &sp);
        mlockall(MCL_CURRENT | MCL_FUTURE);
    }
    else
    {
        printf("Not running with superuser rigthsn");
        exit(1);
    }
    if(argc < 3)
    {
        printf("Using: HiTimer iterations delayn");
        exit(1);
    }
 
    int iter = atoi(argv[1]);
    int delay = atoi(argv[2]);
 
    int i=0;
    struct timespec tS, startT, stopT;
 
    clock_getres(CLOCK_MONOTONIC, &tS); // узнаем разрешение таймера
    printf("Timer res: %ld sec, %ld nsecn", tS.tv_sec, tS.tv_nsec);
 
 
    struct timespec time;
    clock_gettime(CLOCK_MONOTONIC, &startT); // засекаем время начала теста
 
    while(i<iter)
    {   // повторяем iter раз задержку delay
        i++;
        clock_gettime(CLOCK_MONOTONIC, &time); получаем актуальное время
        time.tv_nsec+=delay; // добавляем требуемую задержку
        clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME,
                        &time, NULL); // засыпаем
    }
    clock_gettime(CLOCK_MONOTONIC, &stopT);
    long int nsec=stopT.tv_sec*1000000000 + stopT.tv_nsec
                  -startT.tv_sec*1000000000 + startT.tv_nsec;

    // iter*delay должно примерно равняться nsec, узнаем погрешность задержек 
    printf("Number of iterations: %d timer value: %d nsecn",
                                                   iter, delay);
    printf("Time elapsed:  %ld nsecn", nsec);
 
 
    return 0;
}

А теперь подробней о использованных компонентах.

Используемая структура времени определена в <sys/time.h> и выглядят следующим образом:

struct timespec {
    long    tv_sec;         /* секунды */
    long    tv_nsec;        /* наносекунды */
};
 

Далее мы узнаем и выводим на экран точность(разрешение) системных часов, при помощи функции:

int clock_getres(clockid_t clk_id, struct timespec *res);
в структуру struct timespec *res записывается разрешения, указанных в clockid_t clk_id часов.

clockid_t clk_id может быть:
▪CLOCK_REALTIME: часы реального времени, доступные всем процессам в системе. Часы измеряются в секундах и наносекундах с начала эпохи (то есть 00:00:00 1 января 1970 по Гринвичу). Точность 1/HZ секунд. 
▪CLOCK_MONOTONIC: время непрерывной работы ОС, доступное всем процессам. В Линукс оно измеряются  в секундах и наносекундах после загрузки ОС. Точность 1/HZ с. Время в этих часах не может быть изменено каким-либо процессом, по этому рекомендуется использовать его.
▪CLOCK_PROCESS_CPUTIME_ID: часы, замеряющие время работы процесса. Время данного процесса, потраченное на выполнение в системе, измеряется в секундах и наносекундах. Точность 1/HZ. Значение часов может быть изменено.
▪CLOCK_THREAD_CPUTIME_ID: Как CLOCK_PROCESS_CPUTIME_ID, но для  потока.

Функция:

int clock_gettime(clockid_t clk_id, struct timespec *tp);
записывает в tp время.

Ну и последняя используемая функция:

int clock_nanosleep(clockid_t clock_id, int flags,
                    const struct timespec *request, //задержка
                    struct timespec *remain); 
const struct timespec *request - время задержки, если функция вернет (по какой-либо причине) управление раньше установленного времени, то в переменной struct timespec *remain будет записано оставшиеся время.


Так же отдельной статьи достойны строки этой программы позволяющей ей получить приоритет реального времени, и система планировщиков Linux в целом.

понедельник, 2 января 2012 г.

Raspberry Pi выставлены на аукционе Ebay



Бета-версии плат выставлены на аукцион:

Ссылочка раз

Ссылочка два

Ставку могут сделать только жители Великобритании. Все вырученные средства пойдут в фонд Raspberry Pi Foundation. Сейчас ставки подбираются к 2000 баксов!

Финальная версия платы будет выглядеть так же, за исключением торчащего разьема для SD-карт, который обещают укоротить.



понедельник, 26 декабря 2011 г.

Linux компьютер Raspberry Pi


Ультракомпактный Linux компьютер скоро можно будет заказать на официальном сайте проекта Raspberry Pi . Я бы от такого не отказался бы, тем более что обещанная стоимость всего 25$.