ข้อผิดพลาดของซ็อกเก็ตเกิดขึ้นบ่อยมากในการสื่อสารผ่านเครือข่าย และอาจเกิดขึ้นได้ในหลายขั้นตอนของกระบวนการ รวมถึงการสร้างการเชื่อมต่อ การส่งข้อมูล และการตัดการเชื่อมต่อ ข้อผิดพลาดเหล่านี้อาจเกิดจากปัจจัยหลายประการ เช่น ความล้มเหลวของเครือข่าย การหมดเวลาการเชื่อมต่อ ข้อจำกัดของทรัพยากร หรือการตั้งค่าการกำหนดค่าที่ไม่ถูกต้อง
ให้เราหารือเกี่ยวกับวิธีการที่แตกต่างกันสองวิธีในการตรวจจับข้อผิดพลาดของซ็อกเก็ตในภาษาการเขียนโปรแกรม 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” ให้เป็นข้อความแสดงข้อผิดพลาดที่มนุษย์สามารถอ่านได้ ด้วยการรวมไฟล์ส่วนหัว “
บทสรุป
โดยการทำความเข้าใจค่าที่ส่งคืนและรหัสข้อผิดพลาดที่ได้รับจากฟังก์ชันซ็อกเก็ต เราสามารถตรวจจับและจัดการข้อผิดพลาดของซ็อกเก็ตเหล่านี้ในภาษา C ได้อย่างง่ายดาย ในตัวอย่างการเขียนโปรแกรมแรก เราได้อธิบายวิธีตรวจจับข้อผิดพลาดและส่งคืนค่าโดยใช้ฟังก์ชัน "perror()" ในตัวอย่างที่สอง เราได้อธิบายฟังก์ชัน “strerror()” เพื่อรับข้อความแสดงข้อผิดพลาดโดยละเอียด โดยการทำความเข้าใจวิธีการเหล่านี้ เราสามารถแสดงข้อความแสดงข้อผิดพลาดที่ให้ข้อมูลและยุติโปรแกรมของเราในการเขียนโปรแกรมซ็อกเก็ตได้อย่างถูกต้อง
เกี่ยวกับผู้เขียน
บัมเด็บ กอช
Bamdeb Ghosh มีประสบการณ์ตรงในโดเมนเครือข่ายไร้สาย เขาเป็นผู้เชี่ยวชาญในการวิเคราะห์การจับ Wireshark บนเครือข่ายไร้สายหรือแบบมีสาย พร้อมด้วยความรู้เกี่ยวกับ Android, Bluetooth, คำสั่ง Linux และ Python ติดตามเว็บไซต์ของเขา:wifisharks.com