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

การตรวจจับข้อผิดพลาดของซ็อกเก็ตใน C:คู่มือปฏิบัติ

การตรวจจับข้อผิดพลาดของซ็อกเก็ตใน C:คู่มือปฏิบัติ

ข้อผิดพลาดของซ็อกเก็ตเกิดขึ้นบ่อยมากในการสื่อสารผ่านเครือข่าย และอาจเกิดขึ้นได้ในหลายขั้นตอนของกระบวนการ รวมถึงการสร้างการเชื่อมต่อ การส่งข้อมูล และการตัดการเชื่อมต่อ ข้อผิดพลาดเหล่านี้อาจเกิดจากปัจจัยหลายประการ เช่น ความล้มเหลวของเครือข่าย การหมดเวลาการเชื่อมต่อ ข้อจำกัดของทรัพยากร หรือการตั้งค่าการกำหนดค่าที่ไม่ถูกต้อง

ให้เราหารือเกี่ยวกับวิธีการที่แตกต่างกันสองวิธีในการตรวจจับข้อผิดพลาดของซ็อกเก็ตในภาษาการเขียนโปรแกรม C โดยใช้ฟังก์ชัน "perror()" และ "strerror()"

ข้อผิดพลาดของซ็อกเก็ตคืออะไร

ข้อผิดพลาดของซ็อกเก็ตในภาษา C ส่วนใหญ่จะถูกระบุโดยค่าส่งคืนที่เป็นลบหรือรหัสข้อผิดพลาดเฉพาะที่ส่งคืนโดยฟังก์ชันซ็อกเก็ต รหัสข้อผิดพลาดเหล่านี้ให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับลักษณะของข้อผิดพลาด และช่วยให้เราตรวจจับและแก้ไขปัญหาได้ หากฟังก์ชันซ็อกเก็ตส่งกลับค่าลบ แสดงว่าเกิดข้อผิดพลาดบางอย่างในขณะที่ดำเนินการ ตัวอย่างเช่น หากฟังก์ชัน "socket()" ไม่สามารถสร้างซ็อกเก็ตได้ ก็อาจส่งกลับค่าลบเพื่อระบุถึงความล้มเหลว เราสามารถตรวจจับและตอบสนองต่อข้อผิดพลาดดังกล่าวได้อย่างง่ายดายโดยการตรวจสอบสิ่งนี้

นอกเหนือจากค่าที่ส่งคืนเป็นลบแล้ว ฟังก์ชันซ็อกเก็ตยังตั้งค่าตัวแปร "errno" ซึ่งเป็นตัวแปรส่วนกลางที่เก็บรหัสข้อผิดพลาดเฉพาะที่เกี่ยวข้องกับระบบล่าสุดหรือการเรียกใช้ฟังก์ชันไลบรารี สามารถเข้าถึงตัวแปร “errno” ได้โดยใช้ไฟล์ส่วนหัว “” และมีรหัสข้อผิดพลาดที่กำหนดไว้ล่วงหน้าซึ่งแชร์ข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุของข้อผิดพลาด  ด้วยการทำความเข้าใจความสำคัญของค่าที่ส่งคืนและรหัสข้อผิดพลาด เราสามารถระบุแหล่งที่มาของข้อผิดพลาดและดำเนินการที่เหมาะสมได้

ตัวอย่างการเขียนโปรแกรม 1:ตรวจจับข้อผิดพลาดของซ็อกเก็ตโดยใช้ Strerror()
ฟังก์ชั่น

#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
int หลัก ()
{
    int socketDescriptor;
    struct sockaddr_in ที่อยู่เซิร์ฟเวอร์;
    // สร้างซ็อกเก็ต
    socketDescriptor =ซ็อกเก็ต (AF_INET, SOCK_STREAM, 0);
    ถ้า (socketDescriptor <0)
{
        perror ("การสร้างซ็อกเก็ตล้มเหลว");
        ทางออก (EXIT_FAILURE);
   

    // ตั้งค่าที่อยู่เซิร์ฟเวอร์
    serverAddress.sin_family =AF_INET;
    // ให้เราใช้หมายเลขพอร์ตตัวอย่าง
    serverAddress.sin_port =htons (7070);
    // ที่อยู่ IP ท้องถิ่น
    serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
    // เชื่อมต่อกับเซิร์ฟเวอร์
    ถ้า (เชื่อมต่อ (socketDescriptor, (struct sockaddr * ) &serverAddress, sizeof (serverAddress)) <0)
{
        perror ("การเชื่อมต่อล้มเหลว");
        ทางออก (EXIT_FAILURE);
    }
    // ส่งและรับข้อมูล
 
    // ให้เราปิดซ็อกเก็ต
    ปิด (socketDescriptor);

    กลับ 0;

เอาต์พุต:

$ gcc ผิดพลาด c -o ผิดพลาด
$ ./ผิดพลาด
การเชื่อมต่อล้มเหลว:การเชื่อมต่อถูกปฏิเสธ

คำอธิบาย:

ในตัวอย่างการเขียนโปรแกรมนี้ เราใช้ฟังก์ชัน socket() เพื่อสร้างซ็อกเก็ต หากตัวอธิบายซ็อกเก็ตที่ส่งคืนน้อยกว่า 0 ซึ่งระบุถึงข้อผิดพลาดระหว่างการสร้างซ็อกเก็ต จะใช้ฟังก์ชัน "perror()" เพื่อแสดงข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องและออกจากโปรแกรม ในการสร้างการเชื่อมต่อ ให้ตั้งค่าที่อยู่เซิร์ฟเวอร์และพยายามเชื่อมต่อโดยใช้ฟังก์ชันเชื่อมต่อ() เพื่อตรวจสอบว่าค่าที่ส่งคืนน้อยกว่า 0 หรือไม่ ในกรณีที่การเชื่อมต่อล้มเหลว ฟังก์ชัน "pererror()" จะถูกใช้อีกครั้งเพื่อแสดงข้อความแสดงข้อผิดพลาด และโปรแกรมจะออก ด้วยวิธีนี้ เราสามารถตรวจจับข้อผิดพลาดของซ็อกเก็ตในภาษา C ได้อย่างง่ายดาย สิ่งนี้ช่วยให้เราสามารถแสดงข้อความแสดงข้อผิดพลาดที่เป็นข้อมูลและยุติโปรแกรมได้อย่างถูกต้อง

ตัวอย่างการเขียนโปรแกรม 2:ตรวจจับข้อผิดพลาดของซ็อกเก็ตโดยใช้ฟังก์ชัน Perror()

#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
#รวม
int หลัก ()
{
    int socketDescriptor;
    struct sockaddr_in ที่อยู่เซิร์ฟเวอร์;

    // สร้างซ็อกเก็ต
    socketDescriptor =ซ็อกเก็ต (AF_INET, SOCK_STREAM, 0);
    ถ้า (socketDescriptor <0)
    {
        fprintf (stderr, "ไม่สามารถสร้างซ็อกเก็ต:%s \n", strerror (errno));
       
        ทางออก (EXIT_FAILURE);
   

    // ตั้งค่าที่อยู่เซิร์ฟเวอร์
    serverAddress.sin_family =AF_INET;
    // ให้เราใช้หมายเลขพอร์ตตัวอย่าง
    serverAddress.sin_port =htons (7070);
    // ที่อยู่ IP ท้องถิ่น
    serverAddress.sin_addr.s_addr =inet_addr ("127.0.0.1");
    // ตอนนี้เราพยายามเชื่อมต่อเซิร์ฟเวอร์
    ถ้า (เชื่อมต่อ (socketDescriptor, (struct sockaddr *) &serverAddress, sizeof (serverAddress)) <0) {
        fprintf (stderr, "ไม่สามารถเชื่อมต่อ:%s\n", strerror (errno));
        ทางออก (EXIT_FAILURE);
   

    // ส่งและรับข้อมูล
    //ปิดซอคเก็ต
    ถ้า (ปิด (socketDescriptor) <0)
    {
        fprintf (stderr, "การปิดซ็อกเก็ตล้มเหลว:%s\n", strerror (errno));
        ทางออก (EXIT_FAILURE);
    }
    printf ("ปิดซ็อกเก็ตสำเร็จ\n");
    กลับ 0;

เอาต์พุต:

$ gcc error.c -o ข้อผิดพลาด
$ ./ข้อผิดพลาด
ไม่สามารถเชื่อมต่อ:การเชื่อมต่อถูกปฏิเสธ

คำอธิบาย:

ในตัวอย่างการเขียนโปรแกรมนี้ เราตรวจพบข้อผิดพลาดของซ็อกเก็ตในภาษา C โดยใช้ฟังก์ชัน “strerror()” ฟังก์ชันนี้ช่วยให้เราแปลงรหัสข้อผิดพลาดที่จัดเก็บไว้ในตัวแปร “errno” ให้เป็นข้อความแสดงข้อผิดพลาดที่มนุษย์สามารถอ่านได้ ด้วยการรวมไฟล์ส่วนหัว “” เราสามารถเข้าถึงฟังก์ชัน “strerror()” และระบุค่า “errno” เพื่อรับข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง ในโปรแกรมนี้ หลังจากที่สร้างซ็อกเก็ตแล้ว เราจะตรวจสอบว่าตัวอธิบายซ็อกเก็ตมีค่าน้อยกว่า 0 หรือไม่ ซึ่งหมายถึงความล้มเหลว หากมีข้อผิดพลาดเกิดขึ้น เราจะใช้ฟังก์ชัน "strerror()" ร่วมกับค่า "errno" เพื่อดึงข้อความแสดงข้อผิดพลาด ฟังก์ชัน "fprintf()" จะแสดงข้อความแสดงข้อผิดพลาดในสตรีมข้อผิดพลาดมาตรฐาน ในที่สุด โปรแกรมจะออกโดยมีสถานะล้มเหลว

บทสรุป

โดยการทำความเข้าใจค่าที่ส่งคืนและรหัสข้อผิดพลาดที่ได้รับจากฟังก์ชันซ็อกเก็ต เราสามารถตรวจจับและจัดการข้อผิดพลาดของซ็อกเก็ตเหล่านี้ในภาษา C ได้อย่างง่ายดาย ในตัวอย่างการเขียนโปรแกรมแรก เราได้อธิบายวิธีตรวจจับข้อผิดพลาดและส่งคืนค่าโดยใช้ฟังก์ชัน "perror()" ในตัวอย่างที่สอง เราได้อธิบายฟังก์ชัน “strerror()” เพื่อรับข้อความแสดงข้อผิดพลาดโดยละเอียด โดยการทำความเข้าใจวิธีการเหล่านี้ เราสามารถแสดงข้อความแสดงข้อผิดพลาดที่ให้ข้อมูลและยุติโปรแกรมของเราในการเขียนโปรแกรมซ็อกเก็ตได้อย่างถูกต้อง

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

การตรวจจับข้อผิดพลาดของซ็อกเก็ตใน C:คู่มือปฏิบัติ

บัมเด็บ กอช

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