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

การตรวจจับ Socket Errors ในภาษา C: คู่มือปฏิบัติ

การตรวจจับ Socket Errors ในภาษา C: คู่มือปฏิบัติ

บทนำ

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

เกี่ยวกับผู้เขียน

การตรวจจับ Socket Errors ในภาษา C: คู่มือปฏิบัติ

Bamdeb Ghosh

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