• Почему клиент на Java не может подключиться к серверу (на сокетах)?

    @AVSomov
    При данной постановке вопроса сложно дать прямой ответ, т.к. нет ни кода ни какого-либо анализа и дампов.

    Но можно явно отметить, что работа через сокеты подразумевает, что всю ответственность за правильную работу с сетью программист берёт на себя. Если же есть полная уверенность в корректности кода, тогда стоит обратиться к навыкам отладки или администрирования для сбора дополнительной диагностической информации.

    Например, могу предположить, что не корректно ожидается проброс порта через NAT на WAN-интерфейсе, при фактической передаче пакета на LAN-интерфейс роутера. Попробуйте запустить любой сниферр, вероятно в нём увидите, пакет к роутеру на создание соединение, но ответа не будет, т.к. роутеру не ясно куда перенаправлять этот пакет. При этом обращение из внешней сети по белому IP, при настроенном пробросе, покажет, что обмен работает.
    Ответ написан
    2 комментария
  • ICMP tunnel на c#?

    @AVSomov
    В описании отсутствует уточнение, но судя по фрагменту кода в комментарии, речь идёт только про передачу через ICMP Echo.

    Клиент:
    using System;
    using System.Net;
    using System.Net.NetworkInformation;
    using System.Text;
    
    namespace icmp_client
    {
        public class IcmpClient
        {
            // args[0] can be an IPaddress or host name.
            // args[1] message for send
            public static void Main (string[] args)
            {
                Ping pingSender = new Ping ();
                PingOptions options = new PingOptions ();
    
                // Use the default Ttl value which is 128,
                // but change the fragmentation behavior.
                options.DontFragment = true;
    
                // Create a buffer of 32 bytes of data to be transmitted.
                string data = args[1];
                byte[] buffer = Encoding.ASCII.GetBytes(data);
    
                int timeout = 120;
                PingReply reply = pingSender.Send(args[0], timeout, buffer, options);
                if (reply.Status == IPStatus.Success)
                {
                    Console.WriteLine("Address: {0}", reply.Address.ToString ());
                    Console.WriteLine("Message: {0}", data);
                    Console.WriteLine("Buffer size: {0}", reply.Buffer.Length);
                }
            }
        }
    }


    Параметры коммандной строки:
    1. IP-адресс или имя получателя сообщения
    2. Текст сообщения

    Например: icmp_client.exe 127.0.0.1 "test msg"

    Сервер:
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace icmp_server
    {
        public class IcmpServer
        {
            private const int ICMP_TYPE_OFFSET = 20;
            private const int ICMP_TYPE_ECHO_REQUEST = 8;
            private const int PAYLOAD_OFFSET = 28;
            
            public static void Main(string[] args)
            {            
                IPAddress ipAddr = IPAddress.Parse(args[0]);
                IPEndPoint ipMyEndPoint = new IPEndPoint(ipAddr, 0);
                EndPoint myEndPoint = (ipMyEndPoint);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
                socket.Bind(myEndPoint);
                socket.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(1), null); 
                while (true)
                {
                    Byte[] ReceiveBuffer = new Byte[socket.ReceiveBufferSize];
                    var nBytes = socket.ReceiveFrom(ReceiveBuffer, ReceiveBuffer.Length, SocketFlags.None, ref myEndPoint);
                    var icmpType = ReceiveBuffer[ICMP_TYPE_OFFSET];
                    if (icmpType == ICMP_TYPE_ECHO_REQUEST)
                    {
                        Console.WriteLine("Echo Request received");
                        Console.WriteLine("Received: {0} bytes", nBytes);
                        if(nBytes > PAYLOAD_OFFSET)
                        { 
                          var payLoadSize = nBytes - PAYLOAD_OFFSET;
                          byte[] payLoad = new byte[payLoadSize];
                          Array.Copy(ReceiveBuffer, PAYLOAD_OFFSET, payLoad, 0, payLoadSize);
                          string msg = Encoding.ASCII.GetString(payLoad);
                          Console.WriteLine("Data hex: {0}", BitConverter.ToString(payLoad));
                          Console.WriteLine("Data text: {0}", msg);
                        }
                        Console.WriteLine("---------------");
                    }
                }
    
            }
        }
    }


    Параметры коммандной строки:
    1. IP-адресс интерфейса получения сообщений

    Например: icmp_server.exe 127.0.0.1

    Обращаю внимание, что для работы сервера потребуется запуск с правами Администратора, подробнее: https://docs.microsoft.com/en-us/windows/win32/win....

    Для лучшего понимания, рекомендую (как минимум) ознакомиться с:
    Ответ написан
  • Как разделить на микросервисы список контактов?

    @AVSomov
    Можно выделить несколько вариантов, у каждого есть плюсы\минусы, потому выбор оптимального зависит от конкретной задачи. Первые 2 варианта согласуются с озвученными в вопросе, но не исключаю и 4 вариант.
    1. Модуль списка контактов на клиенте зависит от 3-х сервисов (список контактов, сообщения, анкеты) - проблема в появлении дополнительных зависимостей в клиентском коде, что порой не так просто исправить\обновить и требует согласования контрактов указанных сервисов с клиентским кодом.
    2. Добавление в список контактов кэширующих-полей для соответствующих данных - в данном случае добавляется задача по выработке правил обновления данных в этих полях и их источнику при обновлении. В дополнение может добавиться "лишняя" ответственность к клиенту и\или сервису.
    3. Сервис составного списка контактов, который зависит от сервисов: список контактов, сообщений и анкет - имеем дополнительные зависимости, которые позволяют переместить ответственность по агрегации данных в отдельный сервис и дольше сохранять контракт взаимодействия с клиентами (в данном случае могут использоваться кэширующие-поля как в п.2). К тому же, если со стороны бизнес требований есть "список контактов", то логично, чтобы сервис возвращал весь набор требуемых данных, т.к. способ реализации этой задачи не должен интересовать клиентов сервиса. Но в данном случае предстоит решить задачу недоступности одного из сервисов в процессе обработки запроса (неплохо работает кэширование).
    4. сервис API-шлюз под каждый вид клиента - почти полностью аналогично п.3, с тем отличием, что данный сервис выступает точкой входа для доступа к методам\данным скрывая особенности реализации backend.


    PS: Дополнительные уровни косвенности часто используются для повышения тестируемости, но и оно имеет свою цену.
    Ответ написан
    Комментировать
  • Как загрузить google foto на google disk на win7?

    @AVSomov
    Указанное на скрине приложение предназначено для загрузки данных в облако, а не для экспорта данных из него.
    Просьба ознакомиться с информацией: Как скачать фотографии и видео на устройство и Как скачать свои данные в аккаунте Google
    Ответ написан
  • Существуют ли книги по компьютерным сетям без воды?

    @AVSomov
    Самая актуальная и полная информация "без воды" - стандарты.

    Wiki: https://ru.wikipedia.org/wiki/RFC
    Первоисточник: https://tools.ietf.org/rfc/
    Перевод на русский: rfc2.ru


    PS: Хотя нужно понимать, что многое зависит от реализации, т.к. многое имеет статус "MAY"
    Ответ написан
    Комментировать
  • Может ли камера создать файл объемом больше 4 гб на карте памяти с fat32?

    @AVSomov
    К сведению: https://ru.wikipedia.org/wiki/FAT32
    В целом у данной ФС размер файла не может быть более 4 294 967 295 байт.

    На будущее в 1-ю очередь необходимо сделать бинарный образ содержимого ФС/диска (как минимум на случай выхода из строя карты памяти) и продолжать действия по восстановлению информации уже с копии этого образа.

    Сейчас можете попробовать: https://ru.wikipedia.org/wiki/TestDisk
    Но не совсем ясен текущий статус: "флешка совсем перестала отвечать" - где? на что? Она отображается в диспетчере дисков? (Проблема может оказаться в "железе")
    Ответ написан
    Комментировать
  • Как реализовать интерполяцию точек в 3D?

    @AVSomov
    Правильно заданный вопрос - это уже половина ответа


    Интерполяцию делают для функции по некоторому множеству ее значений и аргументов (часто используется, когда либо определение функции не известно или ее вычисление более затратно нежели получение некоторого значение с достаточной точностью).

    Указанный метод "Трилинейной интерполяции" может быть использован, например, для получения цвета (или любой другой численной характеристики) у точки в трехмерном пространстве.
    Ответ написан
    Комментировать
  • Ошибка при запуске MariaDB после переноса datadir с HDD на SSD. В чём может быть дело?

    @AVSomov
    Не смущает эта строка?
    дек 10 14:33:41 hostname mysqld[28833]: 2016-12-10 14:33:41 140252996253632 [Warning] Can't create test file /home/ssd/mysql/hostname.lower-test


    Проверьте есть ли права на запись\чтение в /home/ssd/mysql/ у учетной записи, под которой стартует процесс.
    Ответ написан
  • Где ошибка в алгоритме разложения cosx в ряд?

    @AVSomov
    Правильно заданный вопрос - это уже половина ответа

    Чтобы улучшить понимание вопроса:
    1. Для начала укажите, какое разложение в ряд используется? Как вариант, ряд Тейлора: https://en.wikipedia.org/wiki/Trigonometric_functi... (но тогда переменная p должна быть инициализирована значением "-1")
    PS: По возможности: приведите к процедурному стилю. В настоящий момент инициализация теста, расчет и вывод результата - все в одном методе. (сами же легко и запутаетесь)
    Ответ написан
    1 комментарий
  • Как правильно составить многотабличный запрос к БД MySQL?

    @AVSomov
    Ключ к решению лежит в использовании агрегатных функций.
    Первоисточник: dev.mysql.com/doc/refman/5.7/en/group-by-functions...
    или www.mysql.ru/docs/gruber/mg06.html

    Конкретно по указанному запросу нужно применить функцию sum и предложение group by.
    Ответ написан
    Комментировать