diff --git a/LauncherDM/Properties/Resources.en.resx b/LauncherDM/Properties/Resources.en.resx index 544325a..032fba7 100644 --- a/LauncherDM/Properties/Resources.en.resx +++ b/LauncherDM/Properties/Resources.en.resx @@ -15,7 +15,7 @@ Reconnect after {0} ms... - The server is unavailable. + The server is unavailable (offline mode). Error! diff --git a/LauncherDM/Properties/Resources.resx b/LauncherDM/Properties/Resources.resx index 6dc7170..7cc3ac5 100644 --- a/LauncherDM/Properties/Resources.resx +++ b/LauncherDM/Properties/Resources.resx @@ -102,7 +102,7 @@ Повторное подключение через {0} мс... - Сервер недоступен. + Сервер недоступен (автономный режим). Ошибка! diff --git a/LauncherDM/Services/Interfaces/ILoadingWindowService.cs b/LauncherDM/Services/Interfaces/ILoadingWindowService.cs index 5a1c3d1..bdc16d0 100644 --- a/LauncherDM/Services/Interfaces/ILoadingWindowService.cs +++ b/LauncherDM/Services/Interfaces/ILoadingWindowService.cs @@ -7,7 +7,5 @@ interface ILoadingWindowService string GetTitle(); bool CheckUpdate(); - - string DescInfoConnect(); } } diff --git a/LauncherDM/Services/LoadingWindowService.cs b/LauncherDM/Services/LoadingWindowService.cs index 3f6e30c..b89f58e 100644 --- a/LauncherDM/Services/LoadingWindowService.cs +++ b/LauncherDM/Services/LoadingWindowService.cs @@ -7,40 +7,30 @@ namespace LauncherDM.Services { class LoadingWindowService : ILoadingWindowService { - private IServerRequestService serverRequest; + private IServerRequestService _serverRequest; - public bool CheckRequestServer() + public LoadingWindowService(ServerRequestService serverRequest) { - if (serverRequest is null) - serverRequest = new ServerRequestService(); + _serverRequest = serverRequest; + } - var requestMessageServer = serverRequest.SendMessageRequest(MessageHeader.MessageType.Check); + public bool CheckRequestServer() + { + var requestMessageServer = _serverRequest.SendMessageRequest(MessageHeader.MessageType.Check); return requestMessageServer?.Message.ToString() == "1"; } public string GetTitle() { - if (serverRequest is null) - serverRequest = new ServerRequestService(); - - var requestMessageServer = serverRequest.SendMessageRequest(MessageHeader.MessageType.TitleLoading); - return requestMessageServer.Message.ToString(); + var requestMessageServer = _serverRequest.SendMessageRequest(MessageHeader.MessageType.TitleLoading); + return requestMessageServer?.Message.ToString(); } public bool CheckUpdate() { - var curver = Assembly.GetExecutingAssembly().GetName().Version?.ToString(); - return false; - } - - public string DescInfoConnect() - { - if (serverRequest is null) - serverRequest = new ServerRequestService(); - - var requestMessageServer = serverRequest.SendMessageRequest(string.Empty, - MessageHeader.MessageType.Check, string.Empty.Length); - return requestMessageServer.Message.ToString(); + var version = Assembly.GetExecutingAssembly().GetName().Version?.ToString(); + var requestMessageServer = _serverRequest.SendMessageRequest(MessageHeader.MessageType.Version); + return requestMessageServer?.Message.ToString() == version; } } } diff --git a/LauncherDM/Services/ServerRequestService.cs b/LauncherDM/Services/ServerRequestService.cs index 21513b3..8386495 100644 --- a/LauncherDM/Services/ServerRequestService.cs +++ b/LauncherDM/Services/ServerRequestService.cs @@ -14,16 +14,16 @@ namespace LauncherDM.Services /// class ServerRequestService : IServerRequestService { - private static readonly string ip = DataInfo.Ip; - private static readonly int port = DataInfo.Port; + private static readonly string _ip = DataInfo.Ip; + private static readonly int _port = DataInfo.Port; - private IPAddress ipAddress; - private IPEndPoint endPoint; + private IPAddress _ipAddress; + private IPEndPoint _endPoint; public ServerRequestService() { - ipAddress = IPAddress.Parse(ip); - endPoint = new IPEndPoint(ipAddress, port); + _ipAddress = IPAddress.Parse(_ip); + _endPoint = new IPEndPoint(_ipAddress, _port); } public MessageHeader SendMessageRequest(string data, MessageHeader.MessageType messageType, int length) @@ -34,9 +34,9 @@ public MessageHeader SendMessageRequest(string data, MessageHeader.MessageType m while (true) { tcpClient = new TcpClient(); - tcpClient.Connect(endPoint); + tcpClient.Connect(_endPoint); - var messageHeader = new MessageHeader(data, messageType, length + MessageHeader.LengthAndDataType); + var messageHeader = new MessageHeader(data, messageType); byte[] headerBytes = messageHeader.MessageToArray(); NetworkStream tcpStream = tcpClient.GetStream(); @@ -76,16 +76,16 @@ public MessageHeader SendMessageRequest(MessageHeader.MessageType messageType) while (true) { tcpClient = new TcpClient(); - tcpClient.Connect(endPoint); + tcpClient.Connect(_endPoint); - var messageHeader = new MessageHeader(messageType, 0); + var messageHeader = new MessageHeader(messageType); byte[] headerBytes = messageHeader.MessageToArray(); NetworkStream tcpStream = tcpClient.GetStream(); tcpStream.Write(headerBytes); do { - byte[] getBytes = new byte[tcpClient.ReceiveBufferSize]; + var getBytes = new byte[tcpClient.ReceiveBufferSize]; var lengthByte = tcpStream.Read(getBytes, 0, tcpClient.ReceiveBufferSize); return MessageHeader.FromArray(getBytes.Take(lengthByte).ToArray()); } while (tcpStream.DataAvailable); diff --git a/LauncherDM/Styles/Other/ContextMenuStyle.xaml b/LauncherDM/Styles/Other/ContextMenuStyle.xaml index 486aff0..c5959a0 100644 --- a/LauncherDM/Styles/Other/ContextMenuStyle.xaml +++ b/LauncherDM/Styles/Other/ContextMenuStyle.xaml @@ -2,6 +2,22 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> \ No newline at end of file diff --git a/LauncherDM/ViewModels/LoadingWindowViewModel.cs b/LauncherDM/ViewModels/LoadingWindowViewModel.cs index a6d12c6..72ec7d6 100644 --- a/LauncherDM/ViewModels/LoadingWindowViewModel.cs +++ b/LauncherDM/ViewModels/LoadingWindowViewModel.cs @@ -8,8 +8,6 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; -using LauncherDM.Properties; -using System.Diagnostics; namespace LauncherDM.ViewModels { @@ -104,7 +102,7 @@ public LoadingWindowViewModel(ResourcesHelperService resourcesHelper) private void Loading() { ICheckNetworkService checkNetwork = new CheckNetworkService(); - ILoadingWindowService server = new LoadingWindowService(); + ILoadingWindowService server = new LoadingWindowService(new ServerRequestService()); Task.Run(() => { @@ -124,6 +122,7 @@ private void Loading() server.CheckUpdate(); Thread.Sleep(5000); OpenWindow(); + break; } else { @@ -131,16 +130,16 @@ private void Loading() { IDialogMessageBoxService dialogMessageBox = new DialogMessageBoxService(); dialogMessageBox.DialogShow(_resourcesHelper.LocalizationGet("Error"), _resourcesHelper.LocalizationGet("ServerClose")); + OpenWindow(); break; } countMs += 2000; DescInfoConnect = string.Format(CultureInfo.InvariantCulture, _resourcesHelper.LocalizationGet("Reconnection"), countMs); - Thread.Sleep(5000); + Thread.Sleep(countMs); } } - OpenWindow(); }); } diff --git a/ServerTCP/DataBase/DataBaseCommands.cs b/ServerTCP/DataBase/DataBaseCommands.cs index 735a4ce..790ebd1 100644 --- a/ServerTCP/DataBase/DataBaseCommands.cs +++ b/ServerTCP/DataBase/DataBaseCommands.cs @@ -10,11 +10,8 @@ public static void Insert(object table, MessageHeader.MessageType messageType) { using (var db = new ApplicationContext()) { - if (db.Database.CanConnect()) - ConsoleExtension.WriteLineColor("База данных доступна.", ConsoleColor.DarkGreen); - else - ConsoleExtension.WriteLineColor("База данных не доступна!", ConsoleColor.DarkRed); - + CheckConnect(db); + switch (messageType) { case MessageHeader.MessageType.Registration: @@ -26,5 +23,37 @@ public static void Insert(object table, MessageHeader.MessageType messageType) } } + public static object Select(MessageHeader.MessageType messageType) + { + using (var db = new ApplicationContext()) + { + CheckConnect(db); + object result = null; + switch (messageType) + { + case MessageHeader.MessageType.Version: + var appWPF = db.apps.Where(x => x.parametername == "wpfDMVersion").ToArray(); + result = appWPF[0].parametervalue; + break; + default: + result = null; + break; + } + + if (result is null) + throw new ArgumentNullException(nameof(result)); + + return result; + } + } + + private static void CheckConnect(ApplicationContext db) + { + if (db.Database.CanConnect()) + ConsoleExtension.WriteLineColor("База данных доступна.", ConsoleColor.DarkGreen); + else + ConsoleExtension.WriteLineColor("База данных не доступна!", ConsoleColor.DarkRed); + } + } } diff --git a/ServerTCP/MessageHeader.cs b/ServerTCP/MessageHeader.cs index 438684c..f435bc8 100644 --- a/ServerTCP/MessageHeader.cs +++ b/ServerTCP/MessageHeader.cs @@ -18,6 +18,7 @@ public enum MessageType : byte Session, Token, Registration, + Version, Log, File, Photo, @@ -31,46 +32,39 @@ public enum MessageType : byte public MessageLanguages.Languages Language { get; } - public int Length { get; } - public object Message { get; } public string Token { get; } - public MessageHeader(MessageType type, MessageLanguages.Languages lang, string token, int length) + public MessageHeader(MessageType type, MessageLanguages.Languages lang, string token) { Type = type; Language = lang; Token = token; - Length = length; } - public MessageHeader(object message, MessageType type, MessageLanguages.Languages lang, string token, int length) + public MessageHeader(object message, MessageType type, MessageLanguages.Languages lang, string token) { Message = message; Type = type; Language = lang; Token = token; - Length = length; } - public MessageHeader(object message, MessageType type, int length) + public MessageHeader(object message, MessageType type) { Message = message; Type = type; - Length = length; } - public MessageHeader(MessageType type, MessageLanguages.Languages lang, int length = 0) + public MessageHeader(MessageType type, MessageLanguages.Languages lang) { Type = type; Language = lang; - Length = length; } - public MessageHeader(MessageType type, int length = 0) + public MessageHeader(MessageType type) { Type = type; - Length = length; } /// @@ -80,48 +74,32 @@ public MessageHeader(MessageType type, int length = 0) /// public byte[] MessageToArray(bool loadToken = false) { - byte[] message; - int lengthByte = loadToken ? Length + TokenLength + LengthAndDataType : Length + LengthAndDataType; + var message = new byte[]{}; + + //switch (Type) + //{ + // default: + // return result; + // break; + //} + + var messageLength = message.Length; + int lengthByte = loadToken ? messageLength + TokenLength + LengthAndDataType : messageLength + LengthAndDataType; var result = new byte[lengthByte]; result[0] = (byte)Type; result[1] = (byte)Language; result[2] = loadToken ? (byte)1 : (byte)0; // 1 - токен есть | 0 - без токена(размер токена 10 байт) - if (Length > 0) + if (messageLength > 0) BinaryPrimitives.WriteInt32LittleEndian(result.AsSpan().Slice(3, 5), lengthByte); - switch (Type) - { - case MessageType.Session: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Registration: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Log: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.File: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Photo: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Data: - message = Encoding.UTF8.GetBytes("1"); - break; - default: - return result; - break; - } - - if (loadToken) - { - Array.Copy(Encoding.UTF8.GetBytes("1234567890"), 0, result, LengthAndDataType, TokenLength); - Array.Copy(message ?? [0], 0, result, LengthAndDataType + TokenLength, Length); - } - else - Array.Copy(message ?? [0], 0, result, 6, Length); + //if (loadToken) + //{ + // Array.Copy(Encoding.UTF8.GetBytes("1234567890"), 0, result, LengthAndDataType, TokenLength); + // Array.Copy(message ?? [0], 0, result, LengthAndDataType + TokenLength, Length); + //} + //else + // Array.Copy(message ?? [0], 0, result, 6, Length); return result; } @@ -133,45 +111,15 @@ public byte[] MessageToArray(bool loadToken = false) /// internal byte[] MessageServerToArray(bool loadToken = false) { - byte[] message; - int lengthByte = loadToken ? Length + TokenLength + LengthAndDataType : Length + LengthAndDataType; - - var result = new byte[lengthByte]; - result[0] = (byte)Type; - result[1] = (byte)Language; - result[2] = loadToken ? (byte)1 : (byte)0; // 1 - токен есть | 0 - без токена(размер токена 10 байт) - lengthByte += 1000; - var bytes = BitConverter.GetBytes(lengthByte).Where(x => x != 0).ToArray(); - - if (bytes.Length > 3) - throw new ArgumentException(nameof(bytes)); - - Array.Copy(bytes, 0, result, 3, bytes.Length); - + var message = new byte[] { }; switch (Type) { - case MessageType.Session: - message = Encoding.UTF8.GetBytes("1"); - break; case MessageType.Token: message = Encoding.UTF8.GetBytes("1234567890"); break; - case MessageType.Registration: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Log: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.File: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Photo: - message = Encoding.UTF8.GetBytes("1"); - break; - case MessageType.Data: - message = Encoding.UTF8.GetBytes("1"); - break; + case MessageType.TitleLoading: + case MessageType.Version: case MessageType.Check: message = Encoding.UTF8.GetBytes(Message.ToString()); break; @@ -180,12 +128,25 @@ internal byte[] MessageServerToArray(bool loadToken = false) break; } - Array.Copy(message ?? [0], 0, result, LengthAndDataType, Length); + var messageLength = message.Length; + var lengthByte = loadToken ? messageLength + TokenLength + LengthAndDataType : messageLength + LengthAndDataType; + var result = new byte[lengthByte]; + result[0] = (byte)Type; + result[1] = (byte)Language; + result[2] = loadToken ? (byte)1 : (byte)0; // 1 - токен есть | 0 - без токена(размер токена 10 байт) + var bytes = BitConverter.GetBytes(lengthByte).Where(x => x != 0).ToArray(); + + if (bytes.Length > 3) + throw new ArgumentException(nameof(bytes)); + + Array.Copy(bytes, 0, result, 3, bytes.Length); + + Array.Copy(message ?? [0], 0, result, LengthAndDataType, messageLength); return result; } /// - /// Распаковка сообщения для клиента + /// Распаковка сообщения /// /// /// @@ -193,58 +154,25 @@ public static MessageHeader FromArray(ReadOnlySpan buffer) { switch ((MessageType)buffer[0]) { - case MessageHeader.MessageType.Check: - return new MessageHeader(Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), (MessageType)buffer[0], 0); - break; - case MessageHeader.MessageType.Session: - return null; - break; - case MessageHeader.MessageType.Token: - //return new MessageHeader(Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), (MessageType)buffer[0], BinaryPrimitives.ReadInt32LittleEndian(buffer[1..])); // сохраняем, добавляем данные. Данные передаются в кодированном формате, будем использовать кодировку UTF8, раскодируем байты - return new MessageHeader((MessageType)buffer[0], (MessageLanguages.Languages)buffer[1], Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), buffer[3] + buffer[4] + buffer[5]); - break; - case MessageHeader.MessageType.Registration: - case MessageHeader.MessageType.Log: - case MessageHeader.MessageType.File: - case MessageHeader.MessageType.Photo: - case MessageHeader.MessageType.Data: - case MessageHeader.MessageType.Title: case MessageHeader.MessageType.TitleLoading: - default: - return null; - break; - } - } - - /// - /// Распаковка сообщения для сервера - /// - /// - /// - internal static MessageHeader ServerFromArray(ReadOnlySpan buffer) - { - switch ((MessageType)buffer[0]) - { + case MessageHeader.MessageType.Version: case MessageHeader.MessageType.Check: - return new MessageHeader((MessageType)buffer[0], (MessageLanguages.Languages)buffer[1], 0); - break; - case MessageHeader.MessageType.Session: - return null; + return new MessageHeader(Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), (MessageType)buffer[0]); break; case MessageHeader.MessageType.Token: //return new MessageHeader(Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), (MessageType)buffer[0], BinaryPrimitives.ReadInt32LittleEndian(buffer[1..])); // сохраняем, добавляем данные. Данные передаются в кодированном формате, будем использовать кодировку UTF8, раскодируем байты - return new MessageHeader((MessageType)buffer[0], (MessageLanguages.Languages)buffer[1], Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType), buffer[3] + buffer[4] + buffer[5]); + return new MessageHeader((MessageType)buffer[0], (MessageLanguages.Languages)buffer[1], Encoding.UTF8.GetString(buffer.ToArray(), LengthAndDataType, buffer.Length - LengthAndDataType)); break; + case MessageHeader.MessageType.Session: case MessageHeader.MessageType.Registration: case MessageHeader.MessageType.Log: case MessageHeader.MessageType.File: case MessageHeader.MessageType.Photo: case MessageHeader.MessageType.Data: case MessageHeader.MessageType.Title: - case MessageHeader.MessageType.TitleLoading: default: return null; - break; + break; } } } diff --git a/ServerTCP/Models/Apps.cs b/ServerTCP/Models/Apps.cs new file mode 100644 index 0000000..d5d1cd8 --- /dev/null +++ b/ServerTCP/Models/Apps.cs @@ -0,0 +1,8 @@ +namespace ServerTCP.Models +{ + internal class Apps + { + public string parametername { get; set; } + public string parametervalue { get; set; } + } +} diff --git a/ServerTCP/Models/Data/ApplicationContext.cs b/ServerTCP/Models/Data/ApplicationContext.cs index 05c020e..666005f 100644 --- a/ServerTCP/Models/Data/ApplicationContext.cs +++ b/ServerTCP/Models/Data/ApplicationContext.cs @@ -1,18 +1,29 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using System.Collections.Generic; +using System.Data; namespace ServerTCP.Models.Data { internal class ApplicationContext : DbContext { public DbSet users { get; set; } + public DbSet apps { get; set; } public ApplicationContext() { //Database.EnsureCreated(); // гарантирует, что БД существует или создаст её и таблицы там } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder + .Entity(builder => + { + builder.HasNoKey(); + }); + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) // подключение к бд { optionsBuilder.UseNpgsql("Host=81.31.246.203;Port=5432;Database=DarkMilkBD;Username=gen_user;Password=lY8\\b@slc^g\\xJ"); diff --git a/ServerTCP/Models/User.cs b/ServerTCP/Models/User.cs index f40fff1..327cca7 100644 --- a/ServerTCP/Models/User.cs +++ b/ServerTCP/Models/User.cs @@ -7,10 +7,5 @@ internal class User public string login { get; set; } public string email { get; set; } public string password { get; set; } - - public User() - { - - } } } diff --git a/ServerTCP/Program.cs b/ServerTCP/Program.cs index c9744a4..0eceb30 100644 --- a/ServerTCP/Program.cs +++ b/ServerTCP/Program.cs @@ -39,11 +39,6 @@ static void Main(string[] args) do { size = listener.Receive(buffer); // получение данных, количество, значение - //byte[] cleanBuffer; - //var lenghtBuffer = buffer[3] + buffer[4] + buffer[5]; - //if (buffer[2] == 1) - // lenghtBuffer += 10; - //cleanBuffer = buffer.Take(lenghtBuffer).ToArray(); var header = MessageHeader.FromArray(buffer.Take(size).ToArray()); MessageHeader headerRequest = null; @@ -53,14 +48,12 @@ static void Main(string[] args) switch (header.Type) { case MessageHeader.MessageType.Check: - headerRequest = new MessageHeader("1", MessageHeader.MessageType.Check, 1); - break; - case MessageHeader.MessageType.Session: + headerRequest = new MessageHeader("1", MessageHeader.MessageType.Check); break; case MessageHeader.MessageType.Token: message = "1234567890"; loadToken = true; - headerRequest = new MessageHeader(message, MessageHeader.MessageType.Token, message.Length); + headerRequest = new MessageHeader(message, MessageHeader.MessageType.Token); break; case MessageHeader.MessageType.Registration: var user = new User @@ -69,23 +62,21 @@ static void Main(string[] args) }; DataBaseCommands.Insert(user, MessageHeader.MessageType.Registration); break; - case MessageHeader.MessageType.Log: - break; - case MessageHeader.MessageType.File: - break; - case MessageHeader.MessageType.Photo: - break; - case MessageHeader.MessageType.Data: - break; - case MessageHeader.MessageType.Title: - break; case MessageHeader.MessageType.TitleLoading: - headerRequest = new MessageHeader("1", MessageHeader.MessageType.TitleLoading, 1); + var tx = "Привет, славяне!"; + headerRequest = new MessageHeader(tx, MessageHeader.MessageType.TitleLoading); + break; + case MessageHeader.MessageType.Version: + var version = DataBaseCommands.Select(MessageHeader.MessageType.Version); + headerRequest = new MessageHeader(version.ToString(), MessageHeader.MessageType.Version); break; } - headerRequestBytes = headerRequest.MessageServerToArray(loadToken); - listener.Send(headerRequestBytes); + if (headerRequest is not null) + { + headerRequestBytes = headerRequest.MessageServerToArray(loadToken); + listener.Send(headerRequestBytes); + } } while (listener.Available > 0); // до тех пор, пока в нашем подключение есть данные, будет продолжаться считывание diff --git a/ServerTCP/S3/ObjectS3.cs b/ServerTCP/S3/ObjectS3.cs new file mode 100644 index 0000000..eff0d2f --- /dev/null +++ b/ServerTCP/S3/ObjectS3.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Amazon; +using Amazon.S3; +using Amazon.S3.Model; + +namespace ServerTCP.S3 +{ + internal class ObjectS3 + { + private string _accessKey = "DOQ61L40I9903B2VJDNO"; + private string _secretKey = "jeNggPSKpz1DlONP8ni31ASWEiaTomBhl5mR0FfC"; + + public ObjectS3() + { + AmazonS3Config configsS3 = new AmazonS3Config + { + ServiceURL = @"https://s3.timeweb.cloud" + }; + + AmazonS3Client client = new AmazonS3Client( + _accessKey, + _secretKey, + configsS3 + ); + + + } + + } +} diff --git a/ServerTCP/ServerTCP - Backup.csproj b/ServerTCP/ServerTCP - Backup.csproj new file mode 100644 index 0000000..9a363a8 --- /dev/null +++ b/ServerTCP/ServerTCP - Backup.csproj @@ -0,0 +1,36 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + True + True + Resources.resx + + + + + + Resources.resx + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + diff --git a/ServerTCP/ServerTCP.csproj b/ServerTCP/ServerTCP.csproj index c27229c..58807ab 100644 --- a/ServerTCP/ServerTCP.csproj +++ b/ServerTCP/ServerTCP.csproj @@ -8,6 +8,8 @@ + +