Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การกลับสตริงใน C/C++ ด้วยโมเดล Client-Server


บทความนี้สาธิตการสร้างระบบ Client-Server ที่ Client ส่งสตริงไปยัง Server และ Server จะกลับสตริงนั้นในลำดับย้อนกลับ (Reverse) แล้วส่งคืนให้ Client โดยใช้ Socket Programming ใน Linux

แนวคิดพื้นฐาน

  • ใช้ Socket Programming สำหรับการเชื่อมต่อระหว่าง Client และ Server
  • ระบุ Port Number เหมือนกันทั้งสองฝั่ง (ตัวอย่างใช้ Port 4000)
  • รันโปรแกรม Server ก่อน ตามด้วย Client

วิธีคอมไพล์และรัน

# คอมไพล์ Server
gcc Server.c -o server

# คอมไพล์ Client  
gcc Client.c -o client

# รัน Server ก่อน (จะรอการเชื่อมต่อ)
./server

# รัน Client ในเทอร์มินัลอีกอัน
./client

โค้ดฝั่ง Client

// Client Side Code
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

#define PORT 4000

int main() {
    struct sockaddr_in server_address;
    int my_socket = 0, valread;
    char str[100];
    char buffer[1024] = { 0 };
    
    printf("Enter a String: ");
    fgets(str, 100, stdin); // อ่านสตริงจนกว่าจะกด Enter
    
    // สร้าง Socket
    if ((my_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\nUnable to create Socket \n");
        return -1;
    }
    
    memset(&server_address, '0', sizeof(server_address));
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(PORT);
    
    // แปลง IP Address
    if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
        printf("\nThe address is not supported \n");
        return -1;
    }
    
    // เชื่อมต่อกับ Server
    if (connect(my_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
        printf("\nUnable to connect to the server \n");
        return -1;
    }
    
    int l = strlen(str);
    send(my_socket, str, sizeof(str), 0); // ส่งข้อความไป Server
    valread = read(my_socket, str, l);    // อ่านข้อความที่ Server ส่งกลับ
    printf("%s\n", str);
    
    return 0;
}

โค้ดฝั่ง Server

// Server Side Code
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

#define PORT 4000

// ฟังก์ชันกลับสตริงแบบ In-place ใช้ XOR Swap
char *strrev(char *str) {
    char *p1, *p2;
    if (!str || !*str) return str;
    for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) {
        *p1 ^= *p2;
        *p2 ^= *p1;
        *p1 ^= *p2;
    }
    return str;
}

int main() {
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    char str[100];
    int addrlen = sizeof(address);
    char buffer[1024] = { 0 };
    char* message = "Welcome to the server";
    
    // สร้าง Socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("Socket connection failed");
        exit(EXIT_FAILURE);
    }
    
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);
    
    // Bind Socket
    if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
        perror("Unable to bind with the socket 4000");
        exit(EXIT_FAILURE);
    }
    
    // รอการเชื่อมต่อ
    if (listen(server_fd, 3) < 0) {
        perror("Listening.....");
        exit(EXIT_FAILURE);
    }
    
    // ยอมรับการเชื่อมต่อ
    if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
        perror("Accept");
        exit(EXIT_FAILURE);
    }
    
    // อ่านสตริงจาก Client
    valread = read(new_socket, str, sizeof(str));
    int l = strlen(str);
    printf("\nString sent by client: %s\n", str);
    
    strrev(str); // กลับสตริง
    send(new_socket, str, sizeof(str), 0); // ส่งกลับไป Client
    printf("\nReversed String is sent\n");
    
    return 0;
}

ผลลัพธ์การทำงาน

Client จะพิมพ์ข้อความที่ Server ส่งกลับมา ซึ่งเป็นสตริงที่ถูกกลับลำดับแล้ว

การกลับสตริงใน C/C++ ด้วยโมเดล Client-Server

หมายเหตุสำคัญ

  • โค้ดนี้เป็นตัวอย่างพื้นฐาน ไม่มีการจัดการ Error อย่างครบถ้วน
  • ในระบบจริงควรใช้ Thread/Fork เพื่อรองรับหลาย Client พร้อมกัน
  • ควรเพิ่มการตรวจสอบ Buffer Overflow และ Input Validation