ซ็อกเก็ตเรียกอีกอย่างว่า "ซ็อกเก็ต" แอปพลิเคชันมักจะส่งคำขอไปยังเครือข่ายหรือตอบสนองต่อคำขอเครือข่ายผ่าน "ซ็อกเก็ต" เพื่อให้โฮสต์หรือกระบวนการบนคอมพิวเตอร์สามารถสื่อสารได้
ในบทนี้ เราจะสอนวิธีใช้บริการ Socket ในภาษา Perl
ใช้ฟังก์ชัน ซ็อกเก็ต เพื่อสร้างบริการซ็อกเก็ต
ใช้ฟังก์ชัน ผูก เพื่อผูกพอร์ต
ใช้ฟังก์ชัน Listen เพื่อฟังพอร์ต
ใช้ฟังก์ชัน ยอมรับ เพื่อรับคำขอของลูกค้า
ใช้ฟังก์ชัน ซ็อกเก็ต เพื่อสร้างบริการซ็อกเก็ต
ใช้ฟังก์ชัน เชื่อมต่อ เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ซ็อกเก็ต
แผนภาพต่อไปนี้สาธิตกระบวนการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์:
ในภาษา Perl เราใช้ฟังก์ชัน socket() เพื่อสร้าง socket รูปแบบไวยากรณ์จะเป็นดังนี้:
ซ็อกเก็ต (ซ็อกเก็ต, โดเมน, ประเภท, โปรโตคอล);
การวิเคราะห์พารามิเตอร์:
ซ็อกเก็ตที่สร้างโดย DOMAIN ระบุชุดโปรโตคอล ตัวอย่างเช่น:
AF_INET
แสดงถึงโปรโตคอลเครือข่าย IPv4
AF_INET6
หมายถึง IPv6
AF_UNIX
หมายถึงซ็อกเก็ตในเครื่อง (ใช้ไฟล์)
ประเภท ซ็อกเก็ตสามารถแบ่งออกเป็น SOCK_STREAM หรือ SOCK_DGRAM ขึ้นอยู่กับว่าเป็นการเชื่อมต่อหรือไม่เชื่อมต่อ
PROTOCOL ควรจะเป็น (getprotobyname('tcp'))[2] ระบุโปรโตคอลการขนส่งจริงที่ใช้
ดังนั้นวิธีการเรียกฟังก์ชันซ็อกเก็ตจึงเป็นดังนี้:
ใช้ Socket # กำหนด PF_INET และ SOCK_STREAMsocket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
ใช้ bind() เพื่อกำหนดที่อยู่ให้กับซ็อกเก็ต:
ผูก (ซ็อกเก็ต, ที่อยู่);
SOCKET ตัวอธิบายซ็อกเก็ต ADDRESS คือที่อยู่ซ็อกเก็ต (TCP/IP) ที่มีองค์ประกอบสามประการ:
คลัสเตอร์ที่อยู่ (TCP/IP คือ AF_INET อาจเป็น 2 ในระบบของคุณ)
หมายเลขพอร์ต (เช่น 21)
ที่อยู่เครือข่าย (เช่น 10.12.12.168)
หลังจากที่สร้างซ็อกเก็ตโดยใช้ socket() แล้ว มีเพียงโปรโตคอลที่ใช้เท่านั้นที่จะได้รับ และไม่ได้กำหนดที่อยู่ ก่อนที่จะยอมรับการเชื่อมต่อจากโฮสต์อื่น จะต้องเรียก bind() เพื่อกำหนดที่อยู่ให้กับซ็อกเก็ต
ตัวอย่างง่ายๆมีดังนี้:
ใช้ Socket # PF_INET และ SOCK_STREAM ถูกกำหนดไว้ $port = 12345; # พอร์ตการฟัง $server_ip_address = "10.12.12.168";bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) หรือ die "ไม่สามารถผูกพอร์ตได้! เอ็น";
หรือตาย ถูกดำเนินการหลังจากล้มเหลวในการผูกที่อยู่
การตั้งค่าพอร์ตสามารถนำมาใช้ซ้ำได้ทันทีโดยการตั้งค่าตัวเลือก setsockopt() SO_REUSEADDR
ฟังก์ชัน pack_sockaddr_in() จะแปลงที่อยู่เป็นรูปแบบไบนารี
หลังจากที่ซ็อกเก็ตถูกผูกไว้กับที่อยู่แล้ว ฟังก์ชัน Listen() จะเริ่มฟังคำขอการเชื่อมต่อที่เป็นไปได้ อย่างไรก็ตาม สามารถใช้ได้เฉพาะเมื่อรับประกันการไหลของข้อมูลที่เชื่อถือได้เท่านั้น:
ฟัง (ซ็อกเก็ต, QUEUESIZE);
SOCKET: ตัวอธิบายซ็อกเก็ต
QUEUESIZE: เป็นจำนวนเต็มที่กำหนดขนาดของคิวการฟัง เมื่อมีการร้องขอการเชื่อมต่อ มันจะเข้าสู่คิวการฟัง เมื่อคำขอการเชื่อมต่อได้รับการยอมรับโดย Accept() มันจะถูกลบออกจากคิวการฟัง คิวเต็ม การเชื่อมต่อใหม่ คำขอจะส่งคืนข้อผิดพลาด
เมื่อยอมรับการเชื่อมต่อแล้ว 0 จะถูกส่งกลับเมื่อสำเร็จและ -1 เมื่อเกิดข้อผิดพลาด
ฟังก์ชัน Accept() ยอมรับการเชื่อมต่อซ็อกเก็ตที่ร้องขอ หากสำเร็จ ส่งคืนรูปแบบการบีบอัดของที่อยู่เครือข่าย มิฉะนั้นจะส่งคืน FALSE:
ยอมรับ ( NEW_SOCKET, SOCKET );
NEW_SOCKET: ตัวอธิบายซ็อกเก็ต
SOCKET: ตัวอธิบายซ็อกเก็ต
ยอมรับ() มักจะใช้ในวงวนไม่สิ้นสุด:
ในขณะที่ (1) { ยอมรับ ( NEW_SOCKET, SOCKT );
ตัวอย่างข้างต้นสามารถตรวจสอบคำขอของลูกค้าได้แบบเรียลไทม์
การเรียกระบบเชื่อมต่อ () ตั้งค่าการเชื่อมต่อสำหรับซ็อกเก็ต พารามิเตอร์เป็นตัวอธิบายไฟล์และที่อยู่โฮสต์
เชื่อมต่อ (ซ็อกเก็ต, ที่อยู่);
ต่อไปนี้จะสร้างอินสแตนซ์ที่เชื่อมต่อกับซ็อกเก็ตเซิร์ฟเวอร์:
$port = 21; # ftp port $server_ip_address = "10.12.12.168"; เชื่อมต่อ( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) หรือ die "ไม่สามารถผูกพอร์ตได้! n";
ต่อไป เราจะใช้ตัวอย่างที่สมบูรณ์เพื่อทำความเข้าใจการประยุกต์ใช้ฟังก์ชันซ็อกเก็ตทั้งหมด:
รหัสเซิร์ฟเวอร์ server.pl:
เปิดเทอร์มินัลแล้วรันโค้ดต่อไปนี้:
$ perl sever.pl การเข้าถึงเริ่มต้น: 7890
รหัสลูกค้า client.pl:
เปิดเทอร์มินัลอื่นแล้วรันโค้ดต่อไปนี้:
$ perl client.plI เป็นข้อมูลจากเซิร์ฟเวอร์