কম্পিউটার টিউটোরিয়াল

C#-এ সকেট প্রোগ্রামিং: TCP/IP নেটওয়ার্ক কমিউনিকেশন

System.Net.Sockets নামস্পেস উইন্ডোজ সকেট ইন্টারফেসের ম্যানেজড ইমপ্লিমেন্টেশন প্রদান করে। সকেট প্রোগ্রামিং দুটি মোডে হয়: সিঙ্ক্রোনাস (ব্লকিং) এবং অ্যাসিঙ্ক্রোনাস (নন-ব্লকিং)।

মূল সকেট ক্লাস এবং প্যারামিটার

Socket socket = new Socket(
    AddressFamily.InterNetwork,  // IPv4
    SocketType.Stream,           // TCP (রিলায়েবল, কানেকশন-অরিয়েন্টেড)
    ProtocolType.Tcp             // TCP প্রোটোকল
);
প্যারামিটারব্যাখ্যা
AddressFamilyঅ্যাড্রেস ফ্যামিলি: InterNetwork (IPv4), InterNetworkV6 (IPv6)
SocketTypeStream (TCP), Dgram (UDP), Raw
ProtocolTypeTcp, Udp, IP, Unspecified

TCP সার্ভার (TcpListener) উদাহরণ

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

public class TcpServer
{
    public static void StartServer(int port = 1234)
    {
        TcpListener listener = new TcpListener(IPAddress.Any, port);
        listener.Start();
        Console.WriteLine($"সার্ভার শুরু হয়েছে পোর্ট {port}-এ");

        while (true)
        {
            // ক্লায়েন্ট কানেকশন অপেক্ষা করুন (ব্লকিং)
            Socket clientSocket = listener.AcceptSocket();
            Console.WriteLine($"ক্লায়েন্ট কানেক্টেড: {clientSocket.RemoteEndPoint}");

            // নেটওয়ার্ক স্ট্রিম তৈরি করুন
            using (NetworkStream stream = new NetworkStream(clientSocket))
            using (StreamReader reader = new StreamReader(stream))
            using (StreamWriter writer = new StreamWriter(stream) { AutoFlush = true })
            {
                string message = reader.ReadLine();
                Console.WriteLine($"প্রাপ্ত: {message}");

                // রেসপন্স পাঠান
                writer.WriteLine($"সার্ভার ইকো: {message}");
            }

            clientSocket.Close();
        }
    }
}

TCP ক্লায়েন্ট উদাহরণ

using System;
using System.Net.Sockets;
using System.IO;

public class TcpClient
{
    public static void Connect(string serverIp, int port = 1234)
    {
        using (TcpClient client = new TcpClient(serverIp, port))
        using (NetworkStream stream = client.GetStream())
        using (StreamReader reader = new StreamReader(stream))
        using (StreamWriter writer = new StreamWriter(stream) { AutoFlush = true })
        {
            Console.WriteLine("সার্ভারের সাথে কানেক্টেড।");

            // মেসেজ পাঠান
            writer.WriteLine("হ্যালো সার্ভার!");
            Console.WriteLine("পাঠানো হয়েছে: হ্যালো সার্ভার!");

            // রেসপন্স পড়ুন
            string response = reader.ReadLine();
            Console.WriteLine($"প্রাপ্ত রেসপন্স: {response}");
        }
    }
}

অ্যাসিঙ্ক্রোনাস সকেট (আধুনিক পদ্ধতি)

.NET Core / .NET 5+ এ SocketAsyncEventArgs বা await SocketTaskExtensions ব্যবহার করুন:

using System;
using System.Net.Sockets;
using System.Threading.Tasks;

public class AsyncTcpClient
{
    public static async Task ConnectAsync(string host, int port)
    {
        using var client = new TcpClient();
        await client.ConnectAsync(host, port);
        
        using var stream = client.GetStream();
        var writer = new StreamWriter(stream) { AutoFlush = true };
        var reader = new StreamReader(stream);

        await writer.WriteLineAsync("অ্যাসিঙ্ক মেসেজ");
        string response = await reader.ReadLineAsync();
        Console.WriteLine($"রেসপন্স: {response}");
    }
}

UDP সকেট (Datagram) - সংক্ষিপ্ত

// UDP সার্ভার
Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpServer.Bind(new IPEndPoint(IPAddress.Any, 5000));

byte[] buffer = new byte[1024];
EndPoint clientEp = new IPEndPoint(IPAddress.Any, 0);
int received = udpServer.ReceiveFrom(buffer, ref clientEp);
string msg = Encoding.UTF8.GetString(buffer, 0, received);

// UDP ক্লায়েন্ট
Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpClient.SendTo(Encoding.UTF8.GetBytes("হ্যালো UDP"), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000));

সর্বোত্তম অনুশীলন

  • স্ট্রিমের জন্য using ব্লক ব্যবহার করুন (অটো ডিসপোজ)।
  • অ্যাসিঙ্ক্রোনাস মেথড (ConnectAsync, SendAsync, ReceiveAsync) ব্যবহার করুন স্কেলেবিলিটির জন্য।
  • বড় ফাইল ট্রান্সফারের জন্য বাফার সাইজ অপ্টিমাইজ করুন।
  • এক্সেপশন হ্যান্ডলিং: SocketException, ObjectDisposedException ক্যাচ করুন।
  • প্রোডাকশনে TLS/SSL এর জন্য SslStream ব্যবহার করুন।
  1. C# প্রোগ্রামিং-এর মূল বৈশিষ্ট্যসমূহ

  2. পাইথনে সকেট প্রোগ্রামিং মাল্টি-থ্রেডিং সহ

  3. পাইথনে সকেট প্রোগ্রামিং (Socket Programming) বেসিক

  4. রুবি নেটওয়ার্ক প্রোগ্রামিং: সকেট দিয়ে কাস্টম ক্লায়েন্ট ও সার্ভার বানান