duplicate connection check

main
syneffort 2 years ago
parent 7a8c240d70
commit c39b6adf3d
  1. 6
      Chat/Client/Singleton.cs
  2. 30
      Chat/Core/DuplicatePacket.cs
  3. 11
      Chat/Core/PServer.cs
  4. 3
      Chat/Core/PacketType.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)

@ -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;
}
}
}

@ -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)
{
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);

@ -18,6 +18,7 @@ namespace Core
EnterRoomResponse,
UserEnter,
UserLeave,
Chat
Chat,
Duplicate
}
}

Loading…
Cancel
Save