Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2020, 17:51   #1
DEVILD
Новичок
Джуниор
 
Регистрация: 09.11.2020
Сообщений: 3
По умолчанию Не могу правильно сложить программу "TCP-протокол и сервер с нуля на C#"

Доброго времени суток всем. Нужна мне по учебе програма вот эта. Сразу скажу что я не владею С#, а лишь знаю С++ на среднем уровне. Мне нужно с тех частей, что приведены в статье на том сайте, сложить полностью програму. Я дошел до первой проверки где результат:

int: 123
double: 123
float: 123
bool: False

Дальше не получается дополнять код, выдает ошибку после добавления:

Код:
class TestPacket
Рабочую часть кода приложил. Так же приложу ее как файл txt.

Буду очень благодарен, если кто то сможет сложить всю програму и скинуть код. Или дополнить код что я скинул до того момента где должна пройти вторая проверка на работоспособность: "После запуска программы должны отобразиться две строки:

Number = 12345
Double = 123,45 "

Буду рад помощи. Спасибо.

main.txt

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO;
using System.Runtime.InteropServices;
using System.Reflection;
 
public class XPacket
{
    public byte PacketType { get; private set; }
    public byte PacketSubtype { get; private set; }
    public List<XPacketField> Fields { get; set; } = new List<XPacketField>();
    
   public class XPacketField
{
    public byte FieldID { get; set; }
    public byte FieldSize { get; set; }
    public byte[] Contents { get; set; }
}
   
    private XPacket() {}
 
public static XPacket Create(byte type, byte subtype)
{
    return new XPacket
    {
        PacketType = type,
        PacketSubtype = subtype
    };
}
 
 
public byte[] ToPacket()
{
    var packet = new MemoryStream();
 
    packet.Write(
    new byte[] {0xAF, 0xAA, 0xAF, PacketType, PacketSubtype}, 0, 5);
 
    var fields = Fields.OrderBy(field => field.FieldID);
 
    foreach (var field in fields)
    {
        packet.Write(new[] {field.FieldID, field.FieldSize}, 0, 2);
        packet.Write(field.Contents, 0, field.Contents.Length);
    }
 
    packet.Write(new byte[] {0xFF, 0x00}, 0, 2);
 
    return packet.ToArray();
}
 
public static XPacket Parse(byte[] packet)
{
    if (packet.Length < 7)
    {
        return null;
    }
 
    if (packet[0] != 0xAF ||
        packet[1] != 0xAA ||
        packet[2] != 0xAF)
    {
        return null;
    }
 
    var mIndex = packet.Length - 1;
 
    if (packet[mIndex - 1] != 0xFF ||
        packet[mIndex] != 0x00)
    {
        return null;
    }
 
    var type = packet[3];
    var subtype = packet[4];
 
    var xpacket = Create(type, subtype);
    var fields = packet.Skip(5).ToArray();
 
    while (true)
    {
        if (fields.Length == 2)
        {
            return xpacket;
        }
 
        var id = fields[0];
        var size = fields[1];
 
        var contents = size != 0 ?
        fields.Skip(2).Take(size).ToArray() : null;
 
        xpacket.Fields.Add(new XPacketField
        {
            FieldID = id,
            FieldSize = size,
            Contents = contents
        });
 
        fields = fields.Skip(2 + size).ToArray();
    }
}
 
public byte[] FixedObjectToByteArray(object value)
{
    var rawsize = Marshal.SizeOf(value);
    var rawdata = new byte[rawsize];
 
    var handle = GCHandle.Alloc(rawdata,
        GCHandleType.Pinned);
 
    Marshal.StructureToPtr(value,
        handle.AddrOfPinnedObject(),
        false);
 
    handle.Free();
 
    return rawdata;
}
private T ByteArrayToFixedObject<T>(byte[] bytes) where T: struct 
{
    T structure;
 
    var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
 
    try
    {
        structure = (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally
    {
        handle.Free();
    }
 
    return structure;
}
 
public XPacketField GetField(byte id)
{
    foreach (var field in Fields)
    {
        if (field.FieldID == id)
        {
            return field;
        }
    }
 
    return null;
}
 
public bool HasField(byte id)
{
    return GetField(id) != null;
}
 
 
public T GetValue<T>(byte id) where T : struct
{
    var field = GetField(id);
 
    if (field == null)
    {
        throw new Exception($"Field with ID {id} wasn't found.");
    }
    var neededSize = Marshal.SizeOf(typeof(T));
 
    if (field.FieldSize != neededSize)
    {
        throw new Exception($"Can't convert field to type {typeof(T).FullName}.\n" + $"We have {field.FieldSize} bytes but we need exactly {neededSize}.");
    }
 
    return ByteArrayToFixedObject<T>(field.Contents);
}
 
public void SetValue(byte id, object structure)
{
    if (!structure.GetType().IsValueType)
    {
        throw new Exception("Only value types are available.");
    }
 
    var field = GetField(id);
 
    if (field == null)
    {
        field = new XPacketField
        {
            FieldID = id
        };
 
        Fields.Add(field);
    }
 
    var bytes = FixedObjectToByteArray(structure);
 
    if (bytes.Length > byte.MaxValue)
    {
        throw new Exception("Object is too big. Max length is 255 bytes.");
    }
 
    field.FieldSize = (byte) bytes.Length;
    field.Contents = bytes;
}
 
}
 
class Program {
    
  static void Main() {
    
    var packet = XPacket.Create(1, 0);
 
packet.SetValue(0, 123);
packet.SetValue(1, 123D);
packet.SetValue(2, 123F);
packet.SetValue(3, false);
 
var packetBytes = packet.ToPacket();
var parsedPacket = XPacket.Parse(packetBytes);
 
Console.WriteLine($"int: {parsedPacket.GetValue<int>(0)}\n" +
                  $"double: {parsedPacket.GetValue<double>(1)}\n" +
                  $"float: {parsedPacket.GetValue<float>(2)}\n" +
                  $"bool: {parsedPacket.GetValue<bool>(3)}");
    
  }
}
DEVILD вне форума Ответить с цитированием
Старый 10.11.2020, 08:24   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Про какую ошибку то вы говорите?
Все нормально собралось.
Изображения
Тип файла: png 123.png (32.3 Кб, 8 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 10.11.2020, 10:53   #3
DEVILD
Новичок
Джуниор
 
Регистрация: 09.11.2020
Сообщений: 3
По умолчанию

WorldMaster, Ошибки выдает далее, код что я выложил работает. Проблемы и ошибки идут тогда, когда к коду что я выложил продолжать добавлять части из сайта. Это части что идут от момента первой проверки где результат что у Вас на скрине, до момента второй проверки, где результат должен быть: "После запуска программы должны отобразиться две строки:

Number = 12345
Double = 123,45 ""
DEVILD вне форума Ответить с цитированием
Старый 10.11.2020, 11:01   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от DEVILD Посмотреть сообщение
Проблемы и ошибки идут тогда, когда к коду что я выложил продолжать добавлять части из сайта.
Машический шар сломался, штатный телепат тоже как назло ушел в отпуск. Так что увы. Ничем помочь не смогу. Код представленный вами успешно собирается запускается и отрабатывает. Ошибок не наблюдаю.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 10.11.2020, 11:13   #5
DEVILD
Новичок
Джуниор
 
Регистрация: 09.11.2020
Сообщений: 3
По умолчанию

WorldMaster, Ну написано же:

Буду очень благодарен, если кто то сможет сложить всю програму и скинуть код. Или дополнить код что я скинул до того момента где должна пройти вторая проверка на работоспособность: "После запуска программы должны отобразиться две строки:

Number = 12345
Double = 123,45 "

Если Вы, и Ваши шары с телепатами не можете/хотите делать то, о чем ТС то бишь я прошу, то не обязательно было отвечать. С уважением.

Последний раз редактировалось DEVILD; 10.11.2020 в 11:21.
DEVILD вне форума Ответить с цитированием
Старый 10.11.2020, 11:24   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от DEVILD Посмотреть сообщение
Проблемы и ошибки идут тогда, когда к коду что я выложил продолжать добавлять части из сайта.
какие ошибки, скриншоты, указания.

Действительно нахрена это все показывать. Люди же сами должны сидеть и гадать что там да как.

ну да ладно ...
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Правильно ли я написал программу на С++ по "мат" примеру? max29 Помощь студентам 13 18.04.2016 00:07