Ответы пользователя по тегу C#
  • Почему декомпилятор не может преобразовать код?

    @none7
    Код самого цикла с точки зрения ilspy выглядит так:
    for (int i = 0; i < bytes.Length; i += 2)
        bytes[i] = (byte)((int)bytes[i] ^ 168 - i);

    но по моему так:
    for (int i = 0; i < bytes.Length; i += 2)
        bytes[i] = (byte)((i - 168) ^ bytes[i]);

    Но выше цикла вообще ересь. Метод System.Console::WriteLine(string) требует 1 аргумент, а System.Text.Encoding::GetBytes(string) требует ещё и объект для которого будет вызван метод. И где же тогда соответствующие ldarg,ldloc ? Запустить этот кусок IL-кода мне также не удалось. Выплёвывает исключение System.InvalidProgramException, может быть этот кусок просто обманка, а реальный в обработчике исключения? Также вполне возможно, что данное приложение полиморф и этот код на самом деле будет переписан во время работы.
    Ответ написан
    1 комментарий
  • Как передать 270 кбайт информации по Сокету?

    @none7
    Размер TCP пакета обычно не превышает 1500 байт. Метод Receive записывает в буфер данные из пакета и возвращает их длину. Файл при желании можно даже передать по 1 байту в каждом пакете, и Receive будет также стабильно возвращать по 1 байту. MTU Loopback интерфейса более 2 Гб, поэтому 300 Кб данных приходят одним пакетом. Метод Send вроде тоже не гарантирует отправку всех данных.
    Ответ написан
    Комментировать
  • Нужно ли проверять полученные данные и отсылать уведомление о их получении при использовании TCP?

    @none7
    В нынешнем Интернете это вероятно не нужно. В Ethernet и оптоволокне шумы приводящие к ошибкам, возможны только при грубом нарушении правил строительства сети. В Wi-Fi, xDSL, сотовых сетях обеспечивают больший контроль целостности на канальном уровне. В IPv6 по этому поводу даже чексумму убрали, осталась только в TCP и UDP. Таких ошибок было много во времена Dial-Up, где контроль целостности на канальном уровне был явно недостаточен.
    Ответ написан
    Комментировать
  • Контрольная сумма С#?

    @none7
    Для первого набора байт подходит такой простой код:
    static byte[] crc(byte[] data) {
        ushort sum = 0;
        foreach (byte b in data)
            sum += b;
        return new byte[] {(byte)(sum & 255), (byte)(sum >> 8)};
    }

    Те есть сумма всех байтов сообщения включая код операции и длину сообщения, но без чексуммы. То есть в документации косяк чексумма считается с 0 по 4+n без -1, n длина данных для команды. Но там ведь сказано, что чексумма это «сумма байтов пакета».

    А вот собственно и полный тест:
    static ushort crc(byte[] data, ushort sum = 0) {
        foreach (byte b in data) sum += b;
        return sum;
    }
    static void Main(string[] args)
    {
        // пакеты без чексумм
        byte[] mass1 = new byte[] { 75, 0, 25, 0, 3, 48, 117, 0, 126, 37, 0, 188, 138, 169, 53, 66, 15, 52, 115, 203, 112, 103, 220, 16, 92, 237, 76, 80, 254};
        byte[] mass2 = new byte[] { 75, 0, 25, 0, 3, 64, 156, 0, 126, 37, 0, 188, 138, 169, 245, 165, 14, 52, 115, 203, 96, 64, 220, 16, 92, 237, 76, 80, 254};
        byte[] mass3 = new byte[] { 75, 0, 25, 0, 3, 80, 195, 0, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
        byte[] mass4 = new byte[] { 75, 0, 25, 0, 3, 112, 17, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
        byte[] mass5 = new byte[] { 75, 0, 25, 0, 3, 60, 134, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
    
        foreach(var mass in new byte[][] {mass1, mass2, mass3, mass4, mass5}) {
            bool first = true;
            Console.Write("{");
            foreach (var b in mass)  {
                if (!first) Console.Write(", ");
                else first = false;
    
                Console.Write(b);
            }
            var sum = BitConverter.GetBytes(crc(mass));
            // вывод чексуммы
            Console.WriteLine(", {0}, {1}}}", sum[0], sum[1]);
        }
    }
    Ответ написан
    2 комментария
  • Можно ли связать консольное c# приложение с веб-мордой?

    @none7
    Интерфейс CGI/FastCGI устроит? Если нет то понадобится обертка преобразующая набор параметров и поток ввода если нужно.
    Ответ написан
    Комментировать
  • Паттерн Dispose от MS?

    @none7
    Если речь о небольшом буфере, то смысла действительно не много. Но если речь о нескольких десятках мегабайт памяти, то ОС свапать начнёт раньше, чем запустит полную сборку мусора. Да и придумывался этот паттерн в первую очередь для блокирующих ресурсов. Таких как файлы, открытые порты, дескрипторы окон, потоки и т.д.
    Ответ написан
    Комментировать
  • Как соединить 2 компа, подключенных к инету: на одном запустить один экземпляр моей программы, на другом - другой, и чтобы экземпляры общались по TCP?

    @none7
    1. IPAddress.Any порт любой какой пожелаете, у каждого сетевого интерфейса есть адрес, его и указывать на удалённой машине, ну или в DNS прописывать. Все адреса системы можно получить через Dns.GetHostAddresses (Dns.GetHostName())
    2. Разве, что брандмауэр настроить, если включен
    3. С компом имеющим "белый" IPv4-адрес или IPv6-адрес любой может запросить соединение независимо от сети и расстояния до этой сети. В случае компа за NAT, только находящиеся в той же сети или через UDP + STUN
    Ответ написан
    Комментировать