Unix Domain Sockets (Unix Domain Sockets)

Computer Programming - ইউনিক্স সকেট (Unix Socket)
272
272

Unix Domain Sockets (UDS) হলো Inter-Process Communication (IPC) এর একটি প্রোটোকল, যা একাধিক প্রক্রিয়ার (process) মধ্যে ডেটা আদান-প্রদানের জন্য ব্যবহৃত হয়। এটি একই সিস্টেমের (মেশিনের) মধ্যে প্রক্রিয়াগুলোর মধ্যে যোগাযোগ স্থাপন করতে সক্ষম। UDS নেটওয়ার্ক সিস্টেমের বাইরে থাকে, অর্থাৎ এটি কেবলমাত্র লোকালহোস্টের (localhost) বা একই সিস্টেমের প্রক্রিয়াগুলোর জন্য কাজ করে। এটি TCP/IP বা UDP প্রোটোকলের বিকল্প হিসেবে ব্যবহৃত হয়, যেখানে ডেটা দ্রুত আদান-প্রদানের জন্য নেটওয়ার্ক স্ট্যাক ব্যবহৃত হয় না।

Unix Domain Sockets (UDS) এর বৈশিষ্ট্য

  1. লোকাল যোগাযোগের জন্য উপযুক্ত:
    • UDS লোকাল (একই সিস্টেমের) প্রক্রিয়াগুলোর মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়। এটি নেটওয়ার্কের বাইরে কাজ করে এবং লোকালহোস্টে থাকা প্রক্রিয়াগুলোর মধ্যে যোগাযোগ সহজ এবং দ্রুত করে তোলে।
  2. TCP/UDP-র মতোই API ব্যবহার করে:
    • UDS সাধারণত TCP এবং UDP-এর মতো একই socket(), bind(), listen(), accept(), এবং connect() API ব্যবহার করে। তবে, UDS-এ IP Address এর পরিবর্তে লোকাল ফাইল সিস্টেমের একটি পাথ ব্যবহার করা হয়।
  3. তরঙ্গ কম এবং দ্রুত (Low Latency):
    • UDS-এ TCP/IP স্ট্যাক ব্যবহৃত হয় না, যার ফলে এর লেটেন্সি কম হয়। এটি সিস্টেম কল ব্যবহার করে প্রক্রিয়াগুলোর মধ্যে দ্রুত ডেটা পাঠাতে সক্ষম।
  4. Datagram এবং Stream Modes সমর্থন:
    • UDS দুই ধরনের যোগাযোগের ধরণ সমর্থন করে:
      • SOCK_STREAM: TCP-এর মতো ধারাবাহিক এবং নির্ভরযোগ্য স্ট্রিম যোগাযোগ।
      • SOCK_DGRAM: UDP-এর মতো ডাটাগ্রাম ভিত্তিক দ্রুত ডেটা ট্রান্সমিশন।
  5. File System-এর সাথে সংযুক্ত:
    • Unix Domain Sockets লোকাল ফাইল সিস্টেমের পাথ (Path) ব্যবহার করে। একটি UDS সিস্টেমে একটি ফাইলের মতোই কাজ করে, যেখানে প্রক্রিয়াগুলো ফাইলের মাধ্যমে যোগাযোগ করে।

Unix Domain Sockets এর ব্যবহার

Unix Domain Sockets সাধারণত নিম্নলিখিত কাজের জন্য ব্যবহৃত হয়:

  1. Inter-Process Communication (IPC):
    • প্রক্রিয়াগুলোর মধ্যে দ্রুত এবং কার্যকরভাবে ডেটা আদান-প্রদানের জন্য UDS ব্যবহৃত হয়। এটি নেটওয়ার্ক স্ট্যাক না ব্যবহার করায় IPC-এর জন্য দ্রুত সমাধান হিসেবে কাজ করে।
  2. সিস্টেম সেবা এবং ডেমন:
    • সিস্টেমের বিভিন্ন সার্ভিস এবং ডেমন (যেমন: MySQL, Docker) প্রায়ই Unix Domain Sockets ব্যবহার করে ক্লায়েন্টদের সাথে যোগাযোগ করে। এটি নিরাপদ এবং দ্রুত যোগাযোগ নিশ্চিত করে।
  3. ডাটাবেস সংযোগ:
    • ডাটাবেস সার্ভার (যেমন MySQL, PostgreSQL) এবং ক্লায়েন্টের মধ্যে লোকাল সংযোগ করার সময় UDS ব্যবহৃত হয়। এটি TCP/IP-এর চেয়ে দ্রুত যোগাযোগ প্রদান করে।

Unix Domain Socket প্রোগ্রাম উদাহরণ (C ভাষায়)

নিচে একটি উদাহরণ দেওয়া হলো যেখানে একটি Unix Domain Socket ব্যবহার করে সার্ভার এবং ক্লায়েন্টের মধ্যে সংযোগ স্থাপন করা হয়:

1. Unix Domain Socket Server Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/uds_socket"

int main() {
    int server_fd, client_fd;
    struct sockaddr_un server_addr, client_addr;
    socklen_t client_len;
    char buffer[100];
    
    // 1. Socket তৈরি করা
    if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }
    
    // 2. ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. Binding করা
    unlink(SOCKET_PATH);
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 4. Listening করা
    if (listen(server_fd, 5) < 0) {
        perror("Listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is listening...\n");

    client_len = sizeof(client_addr);
    // 5. Accepting সংযোগ
    if ((client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
        perror("Accept failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 6. ডেটা গ্রহণ করা
    int n = read(client_fd, buffer, sizeof(buffer));
    buffer[n] = '\0';
    printf("Client: %s\n", buffer);

    // 7. ডেটা পাঠানো
    write(client_fd, "Hello from server", 17);

    // 8. Socket বন্ধ করা
    close(client_fd);
    close(server_fd);
    unlink(SOCKET_PATH);

    return 0;
}

2. Unix Domain Socket Client Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/uds_socket"

int main() {
    int client_fd;
    struct sockaddr_un server_addr;
    char buffer[100];

    // 1. Socket তৈরি করা
    if ((client_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 2. সার্ভার ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. সার্ভারের সাথে সংযোগ স্থাপন করা
    if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        close(client_fd);
        exit(EXIT_FAILURE);
    }

    // 4. ডেটা পাঠানো
    write(client_fd, "Hello from client", 17);

    // 5. ডেটা গ্রহণ করা
    int n = read(client_fd, buffer, sizeof(buffer));
    buffer[n] = '\0';
    printf("Server: %s\n", buffer);

    // 6. Socket বন্ধ করা
    close(client_fd);

    return 0;
}

প্রোগ্রামের বিশ্লেষণ

Server Program:

  1. Socket তৈরি: socket() ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে Socket তৈরি করে।
  2. Binding: Unix ফাইল সিস্টেমে একটি পাথ (SOCKET_PATH) দিয়ে Socket-কে বেঁধে দেয়।
  3. Listening: listen() ফাংশন সার্ভারকে ইনকামিং সংযোগের জন্য অপেক্ষা করায়।
  4. Accepting: accept() ফাংশন ইনকামিং সংযোগ গ্রহণ করে।
  5. ডেটা পাঠানো এবং গ্রহণ: read() এবং write() ফাংশন ক্লায়েন্ট থেকে ডেটা গ্রহণ এবং ক্লায়েন্টে ডেটা পাঠানোর জন্য ব্যবহৃত হয়।

Client Program:

  1. Socket তৈরি: socket() ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে ক্লায়েন্টের Socket তৈরি করে।
  2. Server ঠিকানা সেটআপ: সার্ভারের ঠিকানা (পাথ) সেট করা হয়।
  3. Connection: connect() ফাংশন সার্ভারের সাথে সংযোগ স্থাপন করে।
  4. ডেটা পাঠানো এবং গ্রহণ: write() এবং read() ফাংশন ডেটা পাঠানো এবং গ্রহণের জন্য ব্যবহৃত হয়।
common.content_added_by

Unix Domain Sockets এর ধারণা এবং প্রয়োগ

237
237

Unix Domain Sockets (UDS) হলো একটি Inter-Process Communication (IPC) মেকানিজম, যা একই মেশিনের (সিস্টেমের) মধ্যে চলমান প্রক্রিয়াগুলোর মধ্যে দ্রুত এবং কার্যকরভাবে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। এটি TCP/IP স্যুট-এর বিকল্প হিসেবে ব্যবহৃত হয়, যেখানে প্রক্রিয়াগুলো নেটওয়ার্ক প্রোটোকল ব্যবহার না করে লোকালি যোগাযোগ করে। UDS প্রোটোকলটি সাধারণত AF_UNIX বা AF_LOCAL নামে পরিচিত এবং এটি লোকালহোস্টের মধ্যে প্রক্রিয়াগুলোর মধ্যে যোগাযোগের জন্য আদর্শ।

Unix Domain Sockets এর বৈশিষ্ট্য

  1. লোকাল যোগাযোগ:
    • UDS শুধুমাত্র একই মেশিন বা সিস্টেমের মধ্যে প্রক্রিয়াগুলোর মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়। এটি নেটওয়ার্কের বাইরে থাকে এবং দ্রুত ডেটা ট্রান্সমিশন নিশ্চিত করে।
  2. ফাইল সিস্টেমের ওপর ভিত্তি করে:
    • UDS লোকাল ফাইল সিস্টেমের মাধ্যমে কাজ করে, যেখানে সিস্টেমের মধ্যে একটি সুনির্দিষ্ট পাথ বা ফাইল তৈরির মাধ্যমে যোগাযোগের চ্যানেল তৈরি করা হয়।
  3. নেটওয়ার্ক প্রোটোকলের বিকল্প:
    • TCP/IP প্রোটোকলের মতো নেটওয়ার্ক স্ট্যাক ব্যবহার না করে UDS লোকাল সংযোগের জন্য কাজ করে। এটি প্রক্রিয়াগুলোর মধ্যে দ্রুত এবং কম ওভারহেডের সাথে ডেটা পাঠাতে সহায়ক।
  4. Socket Types:
    • UDS দুটি প্রধান Socket টাইপ সমর্থন করে:
      • SOCK_STREAM: TCP-এর মতো ধারাবাহিক এবং নির্ভরযোগ্য স্ট্রিম যোগাযোগ।
      • SOCK_DGRAM: UDP-এর মতো ডাটাগ্রাম ভিত্তিক দ্রুত যোগাযোগ।
  5. তরঙ্গ কম এবং দ্রুত (Low Latency):
    • UDS সিস্টেম কলের মাধ্যমে কাজ করে, যা নেটওয়ার্ক স্ট্যাকের চেয়ে কম লেটেন্সি এবং দ্রুত পারফরম্যান্স প্রদান করে।

Unix Domain Sockets এর প্রয়োগ

Unix Domain Sockets ব্যবহার করে লোকাল প্রক্রিয়াগুলোর মধ্যে IPC প্রয়োগ করা যায়। UDS বিভিন্ন অ্যাপ্লিকেশন এবং সার্ভিসে ব্যবহৃত হয়, যেমন ডাটাবেস সার্ভার, ডেমন, এবং সিস্টেম সার্ভিস, যেগুলো একই সিস্টেমের মধ্যে দ্রুত যোগাযোগের প্রয়োজন হয়।

Unix Domain Socket Server এবং Client প্রোগ্রাম উদাহরণ (C ভাষায়)

নিচে একটি উদাহরণ দেওয়া হলো যেখানে Unix Domain Sockets ব্যবহার করে একটি সার্ভার এবং ক্লায়েন্ট তৈরি করা হয়েছে:

1. Unix Domain Socket Server Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/uds_socket"

int main() {
    int server_fd, client_fd;
    struct sockaddr_un server_addr, client_addr;
    socklen_t client_len;
    char buffer[100];
    
    // 1. Socket তৈরি করা
    if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }
    
    // 2. ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. Binding করা
    unlink(SOCKET_PATH);
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 4. Listening করা
    if (listen(server_fd, 5) < 0) {
        perror("Listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is listening...\n");

    client_len = sizeof(client_addr);
    // 5. Accepting সংযোগ
    if ((client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
        perror("Accept failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 6. ডেটা গ্রহণ করা
    int n = read(client_fd, buffer, sizeof(buffer));
    buffer[n] = '\0';
    printf("Client: %s\n", buffer);

    // 7. ডেটা পাঠানো
    write(client_fd, "Hello from server", 17);

    // 8. Socket বন্ধ করা
    close(client_fd);
    close(server_fd);
    unlink(SOCKET_PATH);

    return 0;
}

2. Unix Domain Socket Client Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/uds_socket"

int main() {
    int client_fd;
    struct sockaddr_un server_addr;
    char buffer[100];

    // 1. Socket তৈরি করা
    if ((client_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 2. সার্ভার ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. সার্ভারের সাথে সংযোগ স্থাপন করা
    if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        close(client_fd);
        exit(EXIT_FAILURE);
    }

    // 4. ডেটা পাঠানো
    write(client_fd, "Hello from client", 17);

    // 5. ডেটা গ্রহণ করা
    int n = read(client_fd, buffer, sizeof(buffer));
    buffer[n] = '\0';
    printf("Server: %s\n", buffer);

    // 6. Socket বন্ধ করা
    close(client_fd);

    return 0;
}

প্রোগ্রামের বিশ্লেষণ

Server Program:

  1. Socket তৈরি: socket() ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে Socket তৈরি করে।
  2. Binding: Unix ফাইল সিস্টেমের একটি পাথ (SOCKET_PATH) দিয়ে Socket-কে বেঁধে দেয়।
  3. Listening: listen() ফাংশন সার্ভারকে ইনকামিং সংযোগের জন্য অপেক্ষা করায়।
  4. Accepting: accept() ফাংশন ইনকামিং সংযোগ গ্রহণ করে।
  5. ডেটা পাঠানো এবং গ্রহণ: read() এবং write() ফাংশন ক্লায়েন্ট থেকে ডেটা গ্রহণ এবং ক্লায়েন্টে ডেটা পাঠানোর জন্য ব্যবহৃত হয়।

Client Program:

  1. Socket তৈরি: socket() ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে ক্লায়েন্টের Socket তৈরি করে।
  2. Server ঠিকানা সেটআপ: সার্ভারের ঠিকানা (পাথ) সেট করা হয়।
  3. Connection: connect() ফাংশন সার্ভারের সাথে সংযোগ স্থাপন করে।
  4. ডেটা পাঠানো এবং গ্রহণ: write() এবং read() ফাংশন ডেটা পাঠানো এবং গ্রহণের জন্য ব্যবহৃত হয়।

Unix Domain Sockets এর সুবিধা

  1. দ্রুত এবং কার্যকর যোগাযোগ:
    • TCP/IP প্রোটোকলের চেয়ে দ্রুত, কারণ নেটওয়ার্ক স্ট্যাক ব্যবহার না করে সিস্টেম কলের মাধ্যমে কাজ করে।
  2. নিরাপত্তা:
    • UDS শুধুমাত্র লোকাল সিস্টেমে কাজ করে, তাই নেটওয়ার্ক ভিত্তিক আক্রমণ থেকে সুরক্ষিত থাকে।
  3. কম ওভারহেড:
    • TCP/IP কানেকশন সেটআপের ওভারহেড নেই, যা দ্রুত IPC নিশ্চিত করে।

সীমাবদ্ধতা

  1. লোকাল সীমাবদ্ধতা:
    • UDS শুধুমাত্র একই সিস্টেমের মধ্যে কাজ করে, তাই এটি দূরবর্তী প্রক্রিয়াগুলোর মধ্যে যোগাযোগ করতে অক্ষম।
  2. ফাইল সিস্টেমের ওপর নির্ভরশীলতা:
    • UDS পাথ বা ফাইল সিস্টেমের ওপর নির্ভর করে কাজ করে, যা ফাইল সিস্টেমের সমস্যা বা পারমিশন সংক্রান্ত সমস্যার সম্মুখীন হতে পারে।
common.content_added_by

File-based Communication এর সুবিধা

234
234

File-based Communication এমন একটি Inter-Process Communication (IPC) পদ্ধতি যেখানে ফাইল সিস্টেমের মাধ্যমে প্রক্রিয়াগুলোর মধ্যে ডেটা আদান-প্রদান করা হয়। এটি সাধারণত ইউনিক্স সিস্টেমে ব্যবহৃত হয়, যেখানে প্রক্রিয়াগুলো ফাইলের মাধ্যমে যোগাযোগ করে। File-based Communication-এর বেশ কিছু সুবিধা রয়েছে, যা নিচে আলোচনা করা হলো:

File-based Communication এর সুবিধা

Persistence (স্থায়িত্ব):

  • File-based Communication-এর একটি বড় সুবিধা হলো, এটি স্থায়ী (persistent) হয়। ফাইলগুলি সিস্টেমে সংরক্ষিত থাকে এবং সিস্টেম পুনরায় চালু করার পরেও প্রক্রিয়াগুলো ঐ ফাইল থেকে ডেটা পড়তে বা লিখতে পারে। এটি গুরুত্বপূর্ণ তথ্য সংরক্ষণ এবং পুনরুদ্ধার করার জন্য উপযোগী।

Simple and Intuitive Implementation (সরল এবং সহজ বোধগম্য):

  • ফাইলের মাধ্যমে ডেটা আদান-প্রদান করা খুবই সহজ এবং বোধগম্য। প্রক্রিয়াগুলো ফাইল লেখার (write) এবং পড়ার (read) ফাংশন ব্যবহার করে সহজেই ডেটা আদান-প্রদান করতে পারে। এটি সাধারণভাবে পরিচিত পদ্ধতি এবং প্রায় সকল প্রোগ্রামিং ভাষায় সমর্থিত।

Compatibility (সামঞ্জস্য):

  • File-based Communication পদ্ধতি প্রায় সকল অপারেটিং সিস্টেম এবং ফাইল সিস্টেমে সমর্থিত। এটি প্রক্রিয়াগুলোর মধ্যে যোগাযোগের একটি স্ট্যান্ডার্ড পদ্ধতি, যা প্রোগ্রামিং ভাষা এবং প্ল্যাটফর্ম নির্বিশেষে কাজ করতে পারে।

Data Logging এবং Auditing সুবিধা:

  • ফাইলভিত্তিক যোগাযোগের মাধ্যমে লগিং করা সহজ হয়, কারণ ফাইলগুলোতে ডেটা সংরক্ষণ করা থাকে। এভাবে পরবর্তী সময়ে সেগুলো পর্যালোচনা করে কী কী ডেটা আদান-প্রদান হয়েছে তা বিশ্লেষণ করা যায়। এটি auditing এবং debugging-এর জন্য খুবই উপযোগী।

Large Data Handling (বড় ডেটা প্রক্রিয়াকরণ):

  • ফাইল সিস্টেমের মাধ্যমে বড় আকারের ডেটা সহজেই সংরক্ষণ এবং প্রক্রিয়া করা যায়। প্রক্রিয়াগুলো সহজে ফাইল লেখার এবং পড়ার ফাংশনের মাধ্যমে বড় ডেটা ব্লক আদান-প্রদান করতে পারে।

Asynchronous Communication (অসিঙ্ক্রোনাস যোগাযোগ):

  • প্রক্রিয়াগুলো ফাইল ব্যবহার করে ডেটা পাঠাতে পারে এবং পরবর্তী সময়ে অন্য প্রক্রিয়া সেই ডেটা পড়তে পারে। এটি একটি asynchronous যোগাযোগ পদ্ধতি, যেখানে একাধিক প্রক্রিয়া একসাথে ফাইল অ্যাক্সেস না করলেও যোগাযোগ করতে পারে।

Access Control এবং Security (অ্যাক্সেস কন্ট্রোল এবং নিরাপত্তা):

  • File-based Communication ফাইল পারমিশন এবং অ্যাক্সেস কন্ট্রোল ব্যবহার করে নিরাপত্তা নিশ্চিত করতে পারে। ইউনিক্স বা লিনাক্স সিস্টেমে ফাইল পারমিশনের মাধ্যমে নির্দিষ্ট প্রক্রিয়াগুলোকে ফাইল অ্যাক্সেস করার অনুমতি দেওয়া যায়, যা সুরক্ষা বাড়ায়।

Interoperability (ইন্টারঅপারেবিলিটি):

  • ফাইল সিস্টেমের মাধ্যমে যোগাযোগ করা খুবই সাধারণ এবং সহজতর পদ্ধতি, যা বিভিন্ন প্রোগ্রামিং ভাষা ও প্রযুক্তির মধ্যে ইন্টারঅপারেবিলিটি নিশ্চিত করে। এক প্রোগ্রাম বা প্রক্রিয়া ফাইলে ডেটা লিখতে পারে এবং অন্য প্রোগ্রাম তা পড়তে পারে, ভাষা বা প্ল্যাটফর্ম নির্বিশেষে।

Simplicity in Debugging (ডিবাগিং সহজ করে):

  • File-based Communication-এর মাধ্যমে ডিবাগিং সহজ হয়, কারণ ডেটা ফাইলের মধ্যে সংরক্ষিত থাকে এবং প্রক্রিয়াগুলো কীভাবে ডেটা পাঠাচ্ছে বা গ্রহণ করছে তা সহজেই পর্যবেক্ষণ করা যায়। এতে ডিবাগ এবং সমস্যা সমাধান সহজ হয়।

Storage এবং Archival সুবিধা:

  • ফাইলভিত্তিক যোগাযোগে ডেটা সঞ্চয় করে রাখা যায় এবং এটি সহজে আর্কাইভ করা সম্ভব। পুরাতন ডেটা বা লোগ ফাইলগুলো সংরক্ষণ করে পরবর্তীতে ব্যবহার করা যেতে পারে, যা ডেটা ম্যানেজমেন্ট সহজ করে।
common.content_added_by

Named এবং Unnamed Sockets

261
261

Named এবং Unnamed Sockets-এর মধ্যে পার্থক্য এবং তাদের কাজের পদ্ধতি সম্পর্কে আলোচনা করা হলো:

Unnamed Sockets

Unnamed Sockets হলো এমন একটি socket যা কোনো নির্দিষ্ট নাম বা ঠিকানা সংযুক্ত ছাড়াই তৈরি হয়। এটি সাধারণত Inter-Process Communication (IPC) এর জন্য প্রক্রিয়াগুলোর মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়।

Unnamed Sockets এর বৈশিষ্ট্য

  1. নামহীন এবং অস্থায়ী:
    • Unnamed Sockets কোনো নাম বা পাথ (path) ব্যবহার করে না। এটি সাধারণত একবার ব্যবহারযোগ্য বা অস্থায়ী যোগাযোগের জন্য ব্যবহৃত হয়।
  2. Parent এবং Child Process এর মধ্যে যোগাযোগ:
    • Unnamed Sockets প্রায়শই একই প্রক্রিয়ার মধ্যে, যেমন parent এবং child process এর মধ্যে, দ্রুত ডেটা আদান-প্রদানের জন্য ব্যবহৃত হয়। এটি pipe বা socketpair ব্যবহার করে সহজেই তৈরি করা যায়।
  3. কেবলমাত্র একই সিস্টেমে কাজ করে:
    • Unnamed Sockets লোকালি (একই মেশিনে) প্রক্রিয়াগুলোর মধ্যে যোগাযোগ করতে পারে। এটি নেটওয়ার্ক বা দূরবর্তী যোগাযোগের জন্য ব্যবহার করা যায় না।
  4. সাধারণত সাময়িক ব্যবহার:
    • এটি সাধারণত অল্প সময়ের জন্য ব্যবহৃত হয়, যেখানে প্রক্রিয়াগুলোর মধ্যে সাময়িক ডেটা ট্রান্সফার দরকার হয়।

Unnamed Sockets এর উদাহরণ (C ভাষায়)

Unnamed Sockets তৈরি করতে সাধারণত socketpair() ফাংশন ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হলো:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>

int main() {
    int sockets[2];
    char buffer[100];

    // 1. Socket pair তৈরি করা
    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) == -1) {
        perror("socketpair");
        exit(EXIT_FAILURE);
    }

    if (fork() == 0) { // Child process
        close(sockets[0]);
        char *message = "Hello from child";
        write(sockets[1], message, strlen(message));
        close(sockets[1]);
    } else { // Parent process
        close(sockets[1]);
        read(sockets[0], buffer, sizeof(buffer));
        printf("Parent received: %s\n", buffer);
        close(sockets[0]);
    }

    return 0;
}

Named Sockets

Named Sockets হলো এমন একটি socket যা একটি নির্দিষ্ট নাম বা পাথ (path) ব্যবহার করে তৈরি করা হয়। এটি Unix Domain Sockets (UDS) এর একটি উদাহরণ, যেখানে একটি সুনির্দিষ্ট পাথ বা নাম ব্যবহার করে IPC (Inter-Process Communication) সম্পন্ন করা হয়। Named Sockets সাধারণত ফাইল সিস্টেমের একটি অংশ হিসেবে তৈরি হয়।

Named Sockets এর বৈশিষ্ট্য

  1. নির্দিষ্ট নাম বা ঠিকানা ব্যবহার করে:
    • Named Sockets একটি নির্দিষ্ট নাম বা ফাইল সিস্টেমের পাথ ব্যবহার করে তৈরি করা হয়। এটি ফাইলের মতো কাজ করে এবং প্রক্রিয়াগুলো সেই পাথ বা ফাইলের মাধ্যমে যোগাযোগ করে।
  2. বহুল ব্যবহৃত IPC পদ্ধতি:
    • Named Sockets Unix Domain Sockets (UDS) হিসেবে পরিচিত এবং এটি একাধিক প্রক্রিয়ার মধ্যে যোগাযোগ স্থাপন করতে ব্যবহার করা হয়।
  3. স্থায়ী বা দীর্ঘমেয়াদী ব্যবহার:
    • Named Sockets সাধারণত স্থায়ী বা দীর্ঘমেয়াদী যোগাযোগের জন্য ব্যবহৃত হয়, যেখানে একাধিক প্রক্রিয়া একই পাথ ব্যবহার করে একে অপরের সাথে ডেটা আদান-প্রদান করে।
  4. ফাইল সিস্টেমের অংশ:
    • Named Sockets একটি নির্দিষ্ট পাথ বা ফাইল সিস্টেমের অংশ হিসেবে তৈরি হয়, যা প্রক্রিয়াগুলো সহজেই অ্যাক্সেস করতে পারে। এটি সাধারণত /tmp ডিরেক্টরিতে বা সিস্টেমের অন্য কোনো অংশে তৈরি করা হয়।

Named Sockets এর উদাহরণ (C ভাষায়)

নিচে একটি Named Socket-এর উদাহরণ দেওয়া হলো, যেখানে Unix Domain Socket ব্যবহার করে একটি সার্ভার এবং ক্লায়েন্ট তৈরি করা হয়েছে:

Server Program (C ভাষায়):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/named_socket"

int main() {
    int server_fd, client_fd;
    struct sockaddr_un server_addr;
    char buffer[100];

    // 1. Socket তৈরি করা
    if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 2. ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. Binding করা
    unlink(SOCKET_PATH);
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 4. Listening করা
    if (listen(server_fd, 5) < 0) {
        perror("Listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is listening...\n");

    // 5. Accepting সংযোগ
    if ((client_fd = accept(server_fd, NULL, NULL)) < 0) {
        perror("Accept failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 6. ডেটা গ্রহণ করা
    read(client_fd, buffer, sizeof(buffer));
    printf("Client: %s\n", buffer);

    // 7. Socket বন্ধ করা
    close(client_fd);
    close(server_fd);
    unlink(SOCKET_PATH);

    return 0;
}

Client Program (C ভাষায়):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/named_socket"

int main() {
    int client_fd;
    struct sockaddr_un server_addr;

    // 1. Socket তৈরি করা
    if ((client_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 2. সার্ভার ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. সার্ভারের সাথে সংযোগ স্থাপন করা
    if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        close(client_fd);
        exit(EXIT_FAILURE);
    }

    // 4. ডেটা পাঠানো
    char *message = "Hello from client";
    write(client_fd, message, strlen(message));

    // 5. Socket বন্ধ করা
    close(client_fd);

    return 0;
}

Unnamed vs. Named Sockets: তুলনা

বৈশিষ্ট্যUnnamed SocketsNamed Sockets
ঠিকানা ব্যবহারকোনো নাম বা ঠিকানা ব্যবহার করে নাএকটি নির্দিষ্ট নাম বা পাথ ব্যবহার করে
ব্যবহারParent এবং Child process এর মধ্যে সাময়িক IPCদীর্ঘমেয়াদী বা স্থায়ী IPC এর জন্য
ফাইল সিস্টেমফাইল সিস্টেমের ওপর নির্ভর করে নাফাইল সিস্টেমের অংশ হিসেবে কাজ করে
লোকাল বা রিমোটশুধুমাত্র একই সিস্টেমে কাজ করেশুধুমাত্র একই সিস্টেমে কাজ করে
ব্যবহারিক উদাহরণsocketpair() APIUnix Domain Sockets (AF_UNIX, SOCK_STREAM)
common.content_added_by

Unix Domain Socket এর Server এবং Client উদাহরণ

255
255

নিচে Unix Domain Socket ব্যবহার করে একটি সার্ভার এবং ক্লায়েন্ট প্রোগ্রাম উদাহরণ দেওয়া হলো, যা প্রক্রিয়াগুলোর মধ্যে লোকালি (একই সিস্টেমে) যোগাযোগ করতে সহায়ক। এই উদাহরণে C ভাষা ব্যবহার করা হয়েছে, এবং এটি একটি Stream Socket (SOCK_STREAM) প্রোটোকল ব্যবহার করে TCP-এর মতো ধারাবাহিক (reliable) সংযোগ তৈরি করবে।

Unix Domain Socket Server Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/uds_socket"

int main() {
    int server_fd, client_fd;
    struct sockaddr_un server_addr, client_addr;
    socklen_t client_len;
    char buffer[100];
    
    // 1. Socket তৈরি করা
    if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }
    
    // 2. ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. Binding করা
    unlink(SOCKET_PATH); // যদি আগে থেকে কোনো ফাইল থাকে, তা মুছে ফেলা
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }
    
    // 4. Listening করা
    if (listen(server_fd, 5) < 0) {
        perror("Listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    printf("Server is listening...\n");

    client_len = sizeof(client_addr);
    // 5. Accepting সংযোগ
    if ((client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
        perror("Accept failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 6. ডেটা গ্রহণ করা
    int n = read(client_fd, buffer, sizeof(buffer));
    buffer[n] = '\0';
    printf("Client: %s\n", buffer);

    // 7. ডেটা পাঠানো
    write(client_fd, "Hello from server", 17);

    // 8. Socket বন্ধ করা
    close(client_fd);
    close(server_fd);
    unlink(SOCKET_PATH); // Socket ফাইল মুছে ফেলা

    return 0;
}

Unix Domain Socket Client Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/uds_socket"

int main() {
    int client_fd;
    struct sockaddr_un server_addr;
    char buffer[100];

    // 1. Socket তৈরি করা
    if ((client_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 2. সার্ভার ঠিকানা সেটআপ করা
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sun_family = AF_UNIX;
    strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);

    // 3. সার্ভারের সাথে সংযোগ স্থাপন করা
    if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        close(client_fd);
        exit(EXIT_FAILURE);
    }

    // 4. ডেটা পাঠানো
    char *message = "Hello from client";
    write(client_fd, message, strlen(message));

    // 5. ডেটা গ্রহণ করা
    int n = read(client_fd, buffer, sizeof(buffer));
    buffer[n] = '\0';
    printf("Server: %s\n", buffer);

    // 6. Socket বন্ধ করা
    close(client_fd);

    return 0;
}

প্রোগ্রামের বিশ্লেষণ

Server Program:

  1. Socket তৈরি: socket() ফাংশন ব্যবহার করে AF_UNIX এবং SOCK_STREAM দিয়ে একটি Unix Domain Socket তৈরি করা হয়।
  2. Binding: bind() ফাংশন ব্যবহার করে Socket-কে একটি নির্দিষ্ট পাথ (/tmp/uds_socket) এ সংযুক্ত করা হয়।
  3. Listening: listen() ফাংশন ইনকামিং সংযোগের জন্য সার্ভারকে অপেক্ষা করায়।
  4. Accepting: accept() ফাংশন ব্যবহার করে একটি ইনকামিং সংযোগ গ্রহণ করা হয়।
  5. ডেটা গ্রহণ: read() ফাংশন ক্লায়েন্ট থেকে ডেটা গ্রহণ করে।
  6. ডেটা পাঠানো: write() ফাংশন ব্যবহার করে সার্ভার ক্লায়েন্টে ডেটা পাঠায়।
  7. Socket বন্ধ করা: প্রোগ্রাম শেষে সিস্টেমের রিসোর্স মুক্ত করতে close() এবং unlink() ফাংশন ব্যবহার করে Socket বন্ধ এবং মুছে ফেলা হয়।

Client Program:

  1. Socket তৈরি: socket() ফাংশন AF_UNIX এবং SOCK_STREAM দিয়ে ক্লায়েন্টের জন্য একটি Socket তৈরি করে।
  2. সার্ভারের ঠিকানা সেটআপ: সার্ভারের ঠিকানা (পাথ) server_addr.sun_path-এ সেট করা হয়।
  3. Connection: connect() ফাংশন সার্ভারের সাথে সংযোগ স্থাপন করে।
  4. ডেটা পাঠানো: write() ফাংশন ব্যবহার করে ক্লায়েন্ট একটি বার্তা পাঠায়।
  5. ডেটা গ্রহণ: read() ফাংশন ব্যবহার করে সার্ভার থেকে ডেটা গ্রহণ করে।
  6. Socket বন্ধ করা: প্রোগ্রাম শেষে close() ফাংশন ব্যবহার করে Socket বন্ধ করা হয়।

কিভাবে প্রোগ্রামগুলো চালাবেন

প্রথমে সার্ভার প্রোগ্রাম চালু করুন:

  • সার্ভার প্রোগ্রাম চালু হলে এটি /tmp/uds_socket পাথে একটি Unix Domain Socket তৈরি করে এবং ইনকামিং সংযোগের জন্য অপেক্ষা করবে।

এরপর ক্লায়েন্ট প্রোগ্রাম চালু করুন:

  • ক্লায়েন্ট প্রোগ্রাম চালু হলে এটি সেই একই পাথে (যেখানে সার্ভার অপেক্ষমাণ রয়েছে) সংযোগ স্থাপন করবে এবং বার্তা পাঠাবে।

ক্লায়েন্ট এবং সার্ভারের মধ্যে বার্তা আদান-প্রদান:

  • ক্লায়েন্ট একটি বার্তা পাঠাবে, এবং সার্ভার সেটি গ্রহণ করে উত্তরে একটি বার্তা পাঠাবে। উভয় প্রোগ্রাম তাদের নিজ নিজ টার্মিনালে বার্তাগুলো প্রদর্শন করবে।
common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion