diff --git a/Chat/Client/Singleton.cs b/Chat/Client/Singleton.cs index 98a6e22..0dbb40f 100644 --- a/Chat/Client/Singleton.cs +++ b/Chat/Client/Singleton.cs @@ -109,6 +109,12 @@ namespace Client ChatPacket packet = new ChatPacket(dataBuffer); ChatResponsed?.Invoke(packet, EventArgs.Empty); } + else if (packetType == PacketType.Duplicate) + { + socket.Shutdown(SocketShutdown.Send); + MessageBox.Show("중복접속"); + Environment.Exit(0); + } } } catch (Exception ex) diff --git a/Chat/Core/DuplicatePacket.cs b/Chat/Core/DuplicatePacket.cs new file mode 100644 index 0000000..7829a43 --- /dev/null +++ b/Chat/Core/DuplicatePacket.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace Core +{ + public class DuplicatePacket : IPacket + { + public byte[] Serialize() + { + byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.Duplicate)); + + short dataSize = (short)(packetType.Length); + byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize)); + + byte[] buffer = new byte[2 + dataSize]; + + int cursor = 0; + Array.Copy(header, 0, buffer, cursor, header.Length); + cursor += header.Length; + + Array.Copy(packetType, 0, buffer, cursor, packetType.Length); + + return buffer; + } + } +} diff --git a/Chat/Core/PServer.cs b/Chat/Core/PServer.cs index b617926..43e3c5a 100644 --- a/Chat/Core/PServer.cs +++ b/Chat/Core/PServer.cs @@ -85,13 +85,18 @@ namespace Core { LoginRequestPacket requestPacket = new LoginRequestPacket(dataBuffer); - bool result = Clients.TryAdd(requestPacket.Id, clientSocket); + Clients.AddOrUpdate(requestPacket.Id, clientSocket, (oldKey, oldValue) => + { + DuplicatePacket packet = new DuplicatePacket(); + oldValue.Send(packet.Serialize()); + return clientSocket; + }); Console.WriteLine($"[{DateTime.Now}] LoginRequest - Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}"); id = requestPacket.Id; nickname = requestPacket.NickName; - LoginResponsePacket responsePacket = new LoginResponsePacket(result ? StatusCode.Success : StatusCode.Failed); + LoginResponsePacket responsePacket = new LoginResponsePacket(StatusCode.Success); await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None); } else if (packetType == PacketType.CreateRoomRequest) @@ -201,7 +206,9 @@ namespace Core private async Task Remove(string id, string nickname, string roomName, Socket clientSocket) { - Clients.TryRemove(id, out _); + if (Clients.TryGetValue(id, out var client) && client == clientSocket) + Clients.TryRemove(id, out _); + if (Rooms.TryGetValue(roomName, out var room)) { UserLeavePacket packet = new UserLeavePacket(nickname); diff --git a/Chat/Core/PacketType.cs b/Chat/Core/PacketType.cs index d1be89e..a686746 100644 --- a/Chat/Core/PacketType.cs +++ b/Chat/Core/PacketType.cs @@ -18,6 +18,7 @@ namespace Core EnterRoomResponse, UserEnter, UserLeave, - Chat + Chat, + Duplicate } }