บทความนี้สาธิตการสร้างระบบ 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 ส่งกลับมา ซึ่งเป็นสตริงที่ถูกกลับลำดับแล้ว

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