vala
1.0.0
1.0.0
  • Учебник Vala
  • Основы
    • Элементы языка
      • Типы данных
      • Управляющие конструкции
      • Методы
      • Делегаты
      • Лямбды / Замыкания
      • Пространства имён
      • Структуры
      • Классы
    • ООП
      • Основы
      • Конструктор
      • Деструктор
      • Сигналы
      • Свойства(Properties)
      • Наследование
      • Абстрактные классы
      • Интерфейсы / Миксины
      • Полиморфизм
      • Сокрытие методов
      • Информация о типах времени выполнения(Run-Time Type Information)
      • Динамическое приведение типов(Dynamic Type Casting)
      • Универсальные шаблоны(Generics)
      • Создание объектов в стиле GObject
      • Интеграция с D-Bus
      • Профили(Другие бэкенды помимо GLib)
  • Продвинутые возможности
    • Ассерты и контрактное программирование
    • Обработка ошибок
    • Управление параметрами
    • Методы с поддержкой синтаксиса
    • Многопоточность
    • Главный цикл(The Main Loop)
    • Асинхронные методы
    • Слабые ссылки(Weak References)
    • Список аргументов переменной длины
    • Указатели
    • Классы не наследующие Object
    • Коллекции
      • Введение
      • HashSet<G>
      • ArrayList<G>
      • HashMap<K,V>
      • Lock-free структуры
  • Экспериментальные фичи
    • Введение
    • Строгий не null режим(Rust mode)
    • Литералы регулярных выражений(regexp)
    • Цепочки связанных выражений
  • Использование и создание библиотек
    • Введение
    • Инструменты
    • Генерирование VAPI файла из предыдущего с помощью vapigen.
    • Использование библиотек
    • Создание библиотеки
    • Vala and C
    • Meson
      • Config file
      • Static Library
      • Shared Library
      • Target GLib Version
  • Технические приёмы
    • Unit тестирование
    • Отладка
    • Использование GLib
  • Продвинуты гайд(WIP)
  • Habr
  • Примеры кода
  • Functional Programming
    • Gpseq
    • Compose
  • Examples
    • Basic
    • GTK
      • Базовые GTK программы
      • Flappy Bird(WIP)
      • DnD
    • Websocket
  • Apps
    • Games
  • Meson-Book
    • MesonBook
    • Wrap
    • Crosscompile
    • Object files
    • Library
    • Executable
    • Code Generation
    • Installing
    • Unit Tests
    • Meson 0.54
    • Meson 0.53
  • golang-book
    • Ваша первая программа
    • Типы
    • UPDATE.MD
Powered by GitBook
On this page
  • Ntp Client
  • Weather Client

Was this helpful?

Примеры кода

Ntp Client

#!/usr/bin/env vala --pkg=Posix
struct NtpPacket
{
    uint8 li_vn_mode;      // Eight bits. li, vn, and mode.
                                // li.   Two bits.   Leap indicator.
                                // vn.   Three bits. Version number of the protocol.
                                // mode. Three bits. Client will pick mode 3 for client.

    uint8 stratum;         // Eight bits. Stratum level of the local clock.
    uint8 poll;            // Eight bits. Maximum interval between successive messages.
    uint8 precision;       // Eight bits. Precision of the local clock.

    uint32 rootDelay;      // 32 bits. Total round trip delay time.
    uint32 rootDispersion; // 32 bits. Max error aloud from primary clock source.
    uint32 refId;          // 32 bits. Reference clock identifier.

    uint32 refTm_s;        // 32 bits. Reference time-stamp seconds.
    uint32 refTm_f;        // 32 bits. Reference time-stamp fraction of a second.

    uint32 origTm_s;       // 32 bits. Originate time-stamp seconds.
    uint32 origTm_f;       // 32 bits. Originate time-stamp fraction of a second.

    uint32 rxTm_s;         // 32 bits. Received time-stamp seconds.
    uint32 rxTm_f;         // 32 bits. Received time-stamp fraction of a second.

    uint32 txTm_s;         // 32 bits and the most important field the client cares about. Transmit time-stamp seconds.
    uint32 txTm_f;         // 32 bits. Transmit time-stamp fraction of a second.
}

void main()
{
    const string hostname = "pool.ntp.org";
    const uint16 portno = 123; // NTP
    
    var packet = NtpPacket();
    assert( sizeof( NtpPacket ) == 48 );
    packet.li_vn_mode = 0x1b;

    unowned Posix.HostEnt server = Posix.gethostbyname( hostname ); // Convert URL to IP.
    if ( server == null )
    {
        error( @"Can't resolve host $hostname: $(Posix.errno)" );
    }
    print( @"Found $(server.h_addr_list.length) IP address(es) for $hostname\n" );
    
    var address = Posix.SockAddrIn();
    address.sin_family = Posix.AF_INET;
    address.sin_port = Posix.htons( portno );
    Posix.memcpy( &address.sin_addr, server.h_addr_list[0], server.h_length );
    var stringAddress = Posix.inet_ntoa( address.sin_addr );    
    print( @"Using $hostname IP address $stringAddress\n" );
    
    var sockfd = Posix.socket( Posix.AF_INET, Posix.SOCK_DGRAM, Posix.IPProto.UDP ); // Create a UDP socket.
    if ( sockfd < 0 )
    {
        error( @"Can't create socket: $(Posix.errno)" );
    }
    var ok = Posix.connect( sockfd, address, sizeof( Posix.SockAddrIn ) );
    if ( ok < 0 )
    {
        error( @"Can't connect: $(Posix.errno)" );
    }

    var written = Posix.write( sockfd, &packet, sizeof( NtpPacket ) );
    if ( written < 0 )
    {
        error( "Can't send UDP packet: $(Posix.errno)" );
    }
    
    var received = Posix.read( sockfd, &packet, sizeof( NtpPacket ) );
    if ( received < 0 )
    {
        error( "Can't read from socket: $(Posix.errno)" );
    }
    
    packet.txTm_s = Posix.ntohl( packet.txTm_s ); // Time-stamp seconds.
    packet.txTm_f = Posix.ntohl( packet.txTm_f ); // Time-stamp fraction of a second.
    const uint64 NTP_TIMESTAMP_DELTA = 2208988800ull;
    time_t txTm = ( time_t ) ( packet.txTm_s - NTP_TIMESTAMP_DELTA );
    var str = Posix.ctime( ref txTm );    

    print( @"Current UTC time is $str" );
}

Weather Client

#!/usr/bin/env vala --pkg=gio-2.0

void main()
{
    var host = "api.apixu.com";
    var port = 80;
    var key = "f4bddf887be54dc188a111908181801";
    var city = "Neu-Isenburg";
    var query = @"/v1/current.json?key=$key&q=$city";
    var message = @"GET $query HTTP/1.1\r\nHost: $host\r\n\r\n";

    try
    {
        var resolver = Resolver.get_default();
        var addresses = resolver.lookup_by_name( host, null );
        var address = addresses.nth_data( 0 );
        stderr.printf( @"Resolved $host to $address\n" );

        var client = new SocketClient();
        var addr = new InetSocketAddress( address, port );
        var conn = client.connect( addr );
        stderr.printf( @"Connected to $host\n" );

        conn.output_stream.write( message.data );
        stderr.printf( @"Wrote request $message\n" );

        var response = new DataInputStream( conn.input_stream );
        var status_line = response.read_line( null ).strip();
        stderr.printf( @"Got status line: '$status_line'\n" );

        if ( ! ( "200" in status_line ) )
        {
            error( "Service did not answer with 200 OK" );
        }

        var headers = new HashTable<string,string>( str_hash, str_equal );
        var line = "";
        while ( line != "\r" )
        {
            line = response.read_line( null );
            var headerComponents = line.strip().split( ":", 2 );
            if ( headerComponents.length == 2 )
            {
                var header = headerComponents[0].strip();
                var value = headerComponents[1].strip();
                headers[ header ] = value;
                stderr.printf( @"Got Header: $header = $value\n" );
            }
        }
        var contentLength = headers[ "Content-Length" ].to_int();

        var jsonResponse = new uint8[ contentLength ];
        size_t actualLength = 0;
        response.read_all( jsonResponse, out actualLength );
        stderr.printf( @"Got $contentLength bytes of JSON response: %s\n", jsonResponse );
        stdout.printf( @"%s", jsonResponse );

    }
    catch (Error e)
    {
        stderr.printf( @"$(e.message)\n" );
    }
}
PreviousHabrNextGpseq

Last updated 4 years ago

Was this helpful?