
บทนำ
Socket errors เป็นเรื่องที่พบได้บ่อยในการสื่อสารเครือข่าย และอาจเกิดขึ้นในหลายขั้นตอน เช่น การสร้างการเชื่อมต่อ การส่งข้อมูล และการตัดการเชื่อมต่อ ข้อผิดพลาดเหล่านี้อาจเกิดจากหลายปัจจัย เช่น ความล้มเหลวของเครือข่าย connection timeouts ข้อจำกัดทรัพยากร หรือการตั้งค่าที่ไม่ถูกต้อง
เราจะอภิปราย 2 วิธีการจับ socket errors ในภาษา C โดยใช้ฟังก์ชัน perror() และ strerror()
Socket Errors คืออะไร?
Socket errors ในภาษา C ระบุหลักโดยค่าส่งกลับเป็นลบ (negative return value) หรือรหัสข้อผิดพลาดเฉพาะที่ส่งกลับโดย socket functions รหัสข้อผิดพลาดเหล่านี้ให้ข้อมูลมีค่ากับลักษณะของข้อผิดพลาด ช่วยให้เราตรวจจับและแก้ไขปัญหาได้ หาก socket function คืนค่าลบ แสดงว่ามีข้อผิดพลาดขณะดำเนินการ ตัวอย่างเช่น หาก socket() สร้าง socket ไม่สำเร็จ อาจคืนค่าลบเพื่อบ่งบอกความล้มเหลว เราสามารถตรวจจับและตอบสนองต่อข้อผิดพลาดเหล่านี้ได้โดยการตรวจสอบค่านี้
นอกจากค่าส่งกลับเป็นลบแล้ว socket functions ยังตั้งค่าตัวแปร global errno ซึ่งเก็บรหัสข้อผิดพลาดเฉพาะที่เกี่ยวข้องกับ system หรือ library function call ล่าสุด ตัวแปร errno เข้าถึงได้ผ่าน header file <errno.h> และมีรหัสข้อผิดพลาดที่กำหนดไว้ล่วงหน้า ให้ข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุของข้อผิดพลาด ด้วยการเข้าใจความสำคัญของค่าส่งกลับและรหัสข้อผิดพลาด เราสามารถระบุแหล่งข้อผิดพลาดและดำเนินการที่เหมาะสมได้
ตัวอย่างโปรแกรม 1: จับ Socket Errors ด้วย perror()
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int socketDescriptor;
struct sockaddr_in serverAddress;
// สร้าง socket
socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// ตั้งค่าที่อยู่เซิร์ฟเวอร์
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(7070); // พอร์ตตัวอย่าง
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // Local IP
// เชื่อมต่อกับเซิร์ฟเวอร์
if (connect(socketDescriptor, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
perror("Connection failed");
exit(EXIT_FAILURE);
}
// ส่งและรับข้อมูล (ข้ามไปในตัวอย่างนี้)
// ปิด socket
close(socketDescriptor);
return 0;
}
ผลลัพธ์
$ gcc err.c -o err
$ ./err
Connection failed: Connection refused
คำอธิบาย
ในตัวอย่างนี้ ใช้ socket() สร้าง socket หาก socket descriptor น้อยกว่า 0 (บ่งบอกข้อผิดพลาด) จะใช้ perror() แสดงข้อความข้อผิดพลาดที่เกี่ยวข้องและออกจากโปรแกรม ตั้งค่าที่อยู่เซิร์ฟเวอร์และพยายามเชื่อมต่อด้วย connect() ตรวจสอบค่าส่งกลับ หากล้มเหลว perror() จะแสดงข้อความข้อผิดพลาดและออกจากโปรแกรม วิธีนี้ช่วยจับ socket errors ใน C ได้ง่าย แสดงข้อความข้อผิดพลาดที่มีข้อมูลและจบโปรแกรมอย่างเหมาะสม
ตัวอย่างโปรแกรม 2: จับ Socket Errors ด้วย strerror()
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
int main() {
int socketDescriptor;
struct sockaddr_in serverAddress;
// สร้าง socket
socketDescriptor = socket(AF_INET, SOCK_STREAM, 0);
if (socketDescriptor < 0) {
fprintf(stderr, "Failed to create socket: %s \n", strerror(errno));
exit(EXIT_FAILURE);
}
// ตั้งค่าที่อยู่เซิร์ฟเวอร์
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(7070);
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
// พยายามเชื่อมต่อเซิร์ฟเวอร์
if (connect(socketDescriptor, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
fprintf(stderr, "Failed to connect: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
// ส่งและรับข้อมูล
// ปิด socket
if (close(socketDescriptor) < 0) {
fprintf(stderr, "Socket closure failed: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("Socket closed successfully.\n");
return 0;
}
ผลลัพธ์
$ gcc error.c -o error
$ ./error
Failed to connect: Connection refused
คำอธิบาย
ในตัวอย่างนี้ จับ socket errors ใน C ด้วยฟังก์ชัน strerror() ฟังก์ชันนี้แปลงรหัสข้อผิดพลาดที่เก็บในตัวแปร errno ให้เป็นข้อความข้อผิดพลาดที่มนุษย์อ่านเข้าใจได้ ด้วยการ include <string.h> เราสามารถเข้าถึง strerror() และส่งค่า errno เพื่อรับข้อความข้อผิดพลาดที่ตรงกัน ในโปรแกรมนี้ หลังสร้าง socket ตรวจสอบว่า socket descriptor น้อยกว่า 0 (ความล้มเหลว) หากเกิดข้อผิดพลาด ใช้ strerror() กับ errno เพื่อดึงข้อความข้อผิดพลาด fprintf() แสดงข้อความบน standard error stream สุดท้ายโปรแกรมออกพร้อมสถานะ failure
ความแตกต่างระหว่าง perror() และ strerror()
| ฟังก์ชัน | คำอธิบาย | การใช้งาน |
|---|---|---|
| perror() | พิมพ์ข้อความข้อผิดพลาดไปยัง stderr โดยอัตโนมัติ ใช้ string ที่ส่งเข้ามาเป็น prefix | ง่าย ใช้ได้ทันที |
| strerror() | คืนสตริงข้อความข้อผิดพลาด ให้ควบคุมรูปแบบการแสดงผลได้ ใช้กับ fprintf() หรือ logging | ยืดหยุ่นกว่า เหมาะสำหรับ logging |
สรุป
ด้วยการเข้าใจค่าส่งกลับและรหัสข้อผิดพลาดที่ socket functions ให้มา เราสามารถจับและจัดการ socket errors ใน C ได้ง่าย ในตัวอย่างแรก อธิบายวิธีจับข้อผิดพลาดและค่าส่งกลับด้วย perror() ในตัวอย่างที่สอง อธิบาย strerror() เพื่อรับข้อความข้อผิดพลาดโดยละเอียด ด้วยการเข้าใจวิธีเหล่านี้ เราสามารถแสดงข้อความข้อผิดพลาดที่มีข้อมูลและจบโปรแกรมอย่างเหมาะสมใน socket programming
เกี่ยวกับผู้เขียน

Bamdeb Ghosh
Bamdeb Ghosh มีประสบการณ์ hands-on ในด้าน Wireless networking เป็นผู้เชี่ยวชาญด้านการวิเคราะห์ Wireshark capture บนเครือข่าย Wireless และ Wired พร้อมความรู้เรื่อง Android, Bluetooth, คำสั่ง Linux และ Python ติดตามเว็บไซต์: wifisharks.com