การเขียนโปรแกรม Perl ซ็อกเก็ต
ซ็อกเก็ตที่เรียกว่า "ซ็อกเก็ต" แอพลิเคชันมักจะออกโดย "ซ็อกเก็ต" เพื่อการร้องขอหรือเครือข่ายการตอบสนองต่อการร้องขอเพื่อให้กระบวนการระหว่างโฮสต์หรือระหว่างคอมพิวเตอร์บนสามารถสื่อสาร
ในส่วนนี้จะเป็นสิ่งที่เราได้รับภาษา Perl วิธีการใช้บริการซ็อกเก็ต
สร้างเซิร์ฟเวอร์
ใช้ฟังก์ชั่นซ็อกเก็ตเพื่อสร้างบริการซ็อกเก็ต
ใช้ฟังก์ชั่นการผูกการผูกพอร์ต
ใช้ฟังก์ชั่นฟังพอร์ต
ใช้ยอมรับฟังก์ชั่นได้รับการร้องขอของลูกค้า
สร้างลูกค้า
ใช้ฟังก์ชั่นซ็อกเก็ตเพื่อสร้างบริการซ็อกเก็ต
การใช้ฟังก์ชั่นการเชื่อมต่อการเชื่อมต่อกับซ็อกเก็ตเซิร์ฟเวอร์
แผนภูมิต่อไปนี้แสดงให้เห็นถึงการไหลของการสื่อสารระหว่างลูกค้าและเซิร์ฟเวอร์:
ฟังก์ชั่นซ็อกเก็ตเซิร์ฟเวอร์
ฟังก์ชั่นซ็อกเก็ต
Perl เราจะใช้ซ็อกเก็ต () ฟังก์ชั่นในการสร้างซ็อกเก็ต, ไวยากรณ์เป็นดังนี้:
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
การวิเคราะห์พารามิเตอร์:
ระบุ DOMAIN โปรโตคอลชุดซ็อกเก็ตที่สร้างขึ้น ตัวอย่างเช่น:
-
AF_INET
บ่งชี้โปรโตคอลเครือข่าย IPv4 -
AF_INET6
สำหรับ IPv6 -
AF_UNIX
หมายถึงซ็อกเก็ตในท้องถิ่น (โดยใช้ไฟล์)
-
ประเภทซ็อกเก็ตประเภทสามารถเชื่อมต่อที่มุ่งเน้นหรือ connectionless เข้า SOCK_STREAM หรือ SOCK_DGRAM
PROTOCOL ควรจะเป็น(getprotobyname (TCP ')) [2]ระบุโปรโตคอลการขนส่งที่เกิดขึ้นจริง
ดังนั้นการเรียกฟังก์ชั่นซ็อกเก็ตดังต่อไปนี้:
use Socket # 定义了 PF_INET 和 SOCK_STREAM socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
ผูก () ฟังก์ชัน
ใช้ผูก () กำหนดที่อยู่กับซ็อกเก็ต:
bind( SOCKET, ADDRESS );
ซ็อกเก็ตอธิบายซ็อกเก็ต ที่อยู่ที่อยู่ซ็อกเก็ต (TCP / IP) มีสามองค์ประกอบ:
ครอบครัวที่อยู่ (TCP / IP คือ AF_INET บนระบบของคุณอาจจะเป็น 2)
หมายเลขพอร์ต (เช่น 21)
ที่อยู่เครือข่าย (เช่น 10.12.12.168)
หลังจากที่ใช้ซ็อกเก็ต () สร้างซ็อกเก็ตเพียงแค่ให้โปรโตคอลที่พวกเขาใช้และไม่ได้กำหนดที่อยู่ ก่อนที่จะยอมรับการเชื่อมต่อโฮสต์อื่น ๆ ที่คุณต้องโทรผูก () กำหนดที่อยู่กับซ็อกเก็ต
ตัวอย่างง่ายๆดังต่อไปนี้:
use 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))) or die "无法绑定端口! \n";
หรือตายในการดำเนินการอยู่ผูกล้มเหลว
โดยการตั้งค่า setsockopt () ตัวเลือก SO_REUSEADDR เพื่อตั้งพอร์ตสามารถนำกลับมาทันที
pack_sockaddr_in () ฟังก์ชันการแปลงที่อยู่เพื่อจัดรูปแบบไบนารี
ฟัง () ฟังก์ชัน
เมื่อซ็อกเก็ตและที่อยู่ผูกพันฟัง () ฟังก์ชั่นจะเริ่มต้นการฟังสำหรับการร้องขอการเชื่อมต่อที่เป็นไปได้ แต่นี้จะสามารถรับประกันกระแสข้อมูลที่เชื่อถือได้เมื่อใช้:
listen( SOCKET, QUEUESIZE );
SOCKET: บ่งซ็อกเก็ต
QUEUESIZE: จำนวนเต็มคือการตัดสินใจในการตรวจสอบขนาดของคิวเมื่อมีการร้องขอการเชื่อมต่อมาถึงก็จะเข้าสู่คิวฟังเมื่อมีการร้องขอการเชื่อมต่อเป็นยอมรับ () เพื่อยอมรับออกจากจอภาพคิวเมื่อคิวเต็มการเชื่อมต่อใหม่ คำขอจะกลับข้อผิดพลาด
เมื่อการเชื่อมต่อเป็นที่ยอมรับก็จะส่งกลับ 0 สำหรับความสำเร็จข้อผิดพลาดกลับ -1
ยอมรับ () ฟังก์ชัน
ยอมรับ () ฟังก์ชันยอมรับการเชื่อมต่อการร้องขอซ็อกเก็ต หากประสบความสำเร็จในรูปแบบการบีบอัดที่อยู่เครือข่ายมิฉะนั้นก็จะส่งกลับเท็จ
accept( NEW_SOCKET, SOCKET );
SOCKET: บ่งซ็อกเก็ต
Address: ที่อยู่ซ็อกเก็ต (TCP / IP) มีสามองค์ประกอบ:
ครอบครัวที่อยู่ (TCP / IP คือ AF_INET บนระบบของคุณอาจจะเป็น 2)
หมายเลขพอร์ต (เช่น 21)
ที่อยู่เครือข่าย (เช่น 10.12.12.168)
ยอมรับ () ซึ่งถูกนำไปใช้มักจะอยู่ในวง จำกัด :
while(1) { accept( NEW_SOCKET, SOCKT ); ....... }
ตัวอย่างข้างต้นสามารถตรวจสอบในเวลาจริงเพื่อการร้องขอของลูกค้า
ฟังก์ชั่นไคลเอนต์
เชื่อมต่อ () ฟังก์ชัน
เชื่อมต่อ () สายระบบการตั้งค่าการเชื่อมต่อซ็อกเก็ตพารามิเตอร์ที่บ่งแฟ้มและที่อยู่โฮสต์
connect( SOCKET, ADDRESS );
ต่อไปนี้จะสร้างการเชื่อมต่อซ็อกเก็ตอินสแตนซ์เซิร์ฟเวอร์:
$port = 21; # ftp 端口 $server_ip_address = "10.12.12.168"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "无法绑定端口! \n";
ตัวอย่างที่สมบูรณ์
ต่อไปเรามาทำความเข้าใจทุกการใช้งานฟังก์ชั่นซ็อกเก็ตผ่านตัวอย่างที่สมบูรณ์:
เซิร์ฟเวอร์ server.pl รหัสสินค้า:
#!/usr/bin/perl -w # Filename : server.pl use strict; use Socket; # 使用端口 7890 作为默认值 my $port = shift || 7890; my $proto = getprotobyname('tcp'); my $server = "localhost"; # 设置本地地址 # 创建 socket, 端口可重复使用,创建多个连接 socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "无法打开 socket $!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "无法设置 SO_REUSEADDR $!\n"; # 绑定端口并监听 bind( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "无法绑定端口 $port! \n"; listen(SOCKET, 5) or die "listen: $!"; print "访问启动:$port\n"; # 接收请求 my $client_addr; while ($client_addr = accept(NEW_SOCKET, SOCKET)) { # send them a message, close connection my $name = gethostbyaddr($client_addr, AF_INET ); print NEW_SOCKET "我是来自服务端的信息"; print "Connection recieved from $name\n"; close NEW_SOCKET; }
เปิด terminal รันรหัสต่อไปนี้:
$ perl sever.pl 访问启动:7890
ไคลเอ็นต์ client.pl รหัสสินค้า:
#!/usr/bin/perl -w # Filename : client.pl use strict; use Socket; # 初始化地址与端口 my $host = shift || 'localhost'; my $port = shift || 7890; my $server = "localhost"; # 主机地址 # 创建 socket 并连接 socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]) or die "无法创建 socket $!\n"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "无法连接:port $port! \n"; my $line; while ($line = <SOCKET>) { print "$line\n"; } close SOCKET or die "close: $!";
เปิด terminal อีกรันโค้ดต่อไปนี้:
$ perl client.pl 我是来自服务端的信息