Initial Commit

This commit is contained in:
2024-10-20 23:08:53 +07:00
commit 6e3782b281
18 changed files with 883 additions and 0 deletions

129
TcpServer/Program.cs Normal file
View File

@@ -0,0 +1,129 @@
// See https://aka.ms/new-console-template for more information
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class TcpServer
{
private static TcpListener server;
private static bool isRunning = true;
private static List<TcpClient> connectedClients = new List<TcpClient>();
static void Main(string[] args)
{
server = new TcpListener(IPAddress.Any, 5000);
server.Start();
Console.WriteLine("Server started on port 5000.");
while (isRunning)
{
var client = server.AcceptTcpClient();
Console.WriteLine("Client connected!");
lock (connectedClients)
{
connectedClients.Add(client); // Add new client to the list
}
// Handle each client connection in a new thread
Thread clientThread = new Thread(HandleClient);
clientThread.Start(client);
}
}
private static void HandleClient(object obj)
{
TcpClient client = (TcpClient)obj;
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[4096];
int bytesRead;
try
{
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
{
string receivedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: " + receivedData);
// Split the message into command and data
string[] messageParts = receivedData.Split(new char[] { ':' }, 2);
if (messageParts.Length < 2) continue; // Ignore malformed messages
string command = messageParts[0];
string message = messageParts[1];
switch (command)
{
case "PUBKEY":
Console.WriteLine("Received RSA Public Key: " + message);
// Broadcast the message to all connected clients (excluding the sender)
BroadcastMessageToClients(client, $"{command}:{message}");
break;
case "AESKEY":
Console.WriteLine("Received Encrypted AES Key: " + message);
// Broadcast the message to all connected clients (excluding the sender)
BroadcastMessageToClients(client, $"{command}:{message}");
break;
case "MSG":
Console.WriteLine("Received AES Encrypted Message: " + message);
// Broadcast the message to all connected clients (excluding the sender)
BroadcastMessageToClients(client, $"{command}:{message}");
break;
case "EXIT":
Console.WriteLine("Client is disconnecting...");
client.Close();
lock (connectedClients)
{
connectedClients.Remove(client); // Remove client from the list
}
return;
default:
Console.WriteLine("Unknown command received: " + command);
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine("Client disconnected with error: " + ex.Message);
}
finally
{
client.Close();
lock (connectedClients)
{
connectedClients.Remove(client);
}
Console.WriteLine("Client disconnected.");
}
}
private static void BroadcastMessageToClients(TcpClient senderClient, string message)
{
byte[] data = Encoding.ASCII.GetBytes("Broadcast: " + message);
lock (connectedClients)
{
foreach (var client in connectedClients)
{
// Send to all clients except the sender
if (client != senderClient)
{
try
{
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
}
catch (Exception ex)
{
Console.WriteLine("Error sending to client: " + ex.Message);
}
}
}
}
}
}

View File

@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>