Latest web development tutorials

بيرل المقبس البرمجة

مقبس المعروف أيضا باسم "محجر"، وعادة ما يتم إصدار طلب من "مأخذ" لطلب شبكة أو شبكة استجابة الطلب، بحيث أن عملية بين المضيفين أو بين كمبيوتر يمكن الاتصال.

هذا القسم هو كل ما حصلنا عليه لغة بيرل كيفية استخدام الخدمات المقبس.


إنشاء الخادم

  • استخدام وظيفةمقبس لإنشاء خدمات مأخذ.

  • استخدم الدالةربط لربط الميناء.

  • استخدامالاستماع الاستماع وظيفة الميناء.

  • استخداماستعرض تتلقى ظيفة طلبات العميل.

إنشاء عميل

  • استخدام وظيفةمقبس لإنشاء خدمات مأخذ.

  • باستخدام وظيفةالاتصال إلى الاتصال مأخذ الخادم.

ويوضح الرسم البياني التالي تدفق الاتصالات بين العميل والخادم:


وظيفة مأخذ الخادم

وظيفة مقبس

بيرل، ونحن نستخدم وظيفة مقبس () لإنشاء مأخذ، بناء الجملة كما يلي:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

المعلمات التحليلية:

  • تحدد مجموعة بروتوكول المجال مأخذ بإنشائه. على سبيل المثال:

    • AF_INET يشير بروتوكول الشبكة عناوين IPv4
    • AF_INET6 ل IPv6
    • AF_UNIX يمثل مأخذ المحلي (باستخدام ملف)

  • نوع المقبس نوع يمكن أن يكون مهيأ للاتصال أو بدون اتصال إلى SOCK_STREAM أو SOCK_DGRAM

  • وينبغي أن يكون بروتوكول(getprotobyname ( 'برنامج التعاون الفني')) [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";

أو يموت في عنوان ربط فشل التنفيذ.

بواسطة تعيين الخيار SO_REUSEADDR setsockopt () لتعيين منفذ يمكن إعادة استخدامها على الفور.

وظيفةpack_sockaddr_in () لتحويل عناوين إلى تنسيق ثنائي.

الاستماع وظيفة ()

وسوف تبدأ وظيفة عند مأخذ وعنوان ملزمة، والاستماع () الاستماع لطلبات الاتصال الممكنة. ومع ذلك، وهذا يمكن أن تضمن فقط تيار بيانات موثوقة عند استخدام:

listen( SOCKET, QUEUESIZE );

المقبس: واصف مأخذ.

QUEUESIZE: صحيح هو قرار لمراقبة حجم قائمة الانتظار، عندما يكون هناك وصول طلب اتصال، وسوف تدخل قائمة انتظار الاستماع، وعندما طلب اتصال هو قبول () لقبول، وإزالتها من رصد طابور، وعندما قائمة الانتظار هو الكامل، وصلات جديدة وطلب بإرجاع خطأ.

مرة واحدة يتم قبول الصدد، فإنها ترجع 0 من أجل نجاح أو خطأ عودة -1.

استعرض وظيفة ()

وظيفة تقبل () تقبل طلب الاتصال المقبس. في حال نجاحها في شكل مضغوط عنوان الشبكة، وإلا فإنها ترجع كاذبة:

accept( NEW_SOCKET, SOCKET );

المقبس: واصف مأخذ.

العنوان: العنوان هو عنوان المقبس (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;
}

فتح المعبر، تنفيذ التعليمات البرمجية التالية:

$ 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: $!";

فتح معبر آخر، تنفيذ التعليمات البرمجية التالية:

$ perl client.pl
我是来自服务端的信息