Latest web development tutorials

การเขียนโปรแกรม 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
我是来自服务端的信息