Latest web development tutorials

Perl Socket Programming

Socket juga dikenal sebagai "socket", aplikasi ini biasanya dikeluarkan oleh "socket" untuk permintaan jaringan atau network respon permintaan, sehingga proses antara host atau antara komputer di dapat berkomunikasi.

Bagian ini adalah semua yang kami terima bahasa Perl cara menggunakan layanan Socket.


membuat server

  • Gunakan fungsisocket untuk membuat layanan socket.

  • Gunakan fungsimengikat untuk mengikat pelabuhan.

  • Gunakanmendengarkan mendengarkan fungsi pelabuhan.

  • Gunakanmenerima fungsi menerima permintaan klien.

Membuat klien

  • Gunakan fungsisocket untuk membuat layanan socket.

  • Menggunakan fungsiconnect untuk menghubungkan ke server socket.

Bagan berikut ini merupakan arus komunikasi antara klien dan server:


Fungsi Server soket

fungsi socket

Perl, kita menggunakan fungsi socket () untuk membuat socket, sintaks adalah sebagai berikut:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

parameter analisis:

  • Menentukan protokol mengatur soket DOMAIN dibuat. Sebagai contoh:

    • AF_INET menunjukkan protokol jaringan IPv4
    • AF_INET6 untuk IPv6
    • AF_UNIX mewakili soket lokal (menggunakan file)

  • Jenis TYPE socket dapat koneksi-oriented atau connectionless ke SOCK_STREAM atau SOCK_DGRAM

  • PROTOKOL harus(getprotobyname ( 'tcp')) [2].Tentukan protokol transport yang sebenarnya.

Jadi fungsi socket panggilan sebagai berikut:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);

bind () function

Gunakan mengikat () menetapkan alamat ke soket:

bind( SOCKET, ADDRESS );

Socket descriptor socket. ALAMAT alamat socket (TCP / IP) mengandung tiga unsur:

  • Alamat keluarga (TCP / IP, adalah AF_INET, pada sistem Anda mungkin 2)

  • Nomor port (seperti 21)

  • alamat jaringan (seperti 10.12.12.168)

Setelah menggunakan socket () menciptakan socket, hanya memberikan protokol yang mereka gunakan dan tidak memberikan alamat. Sebelum menerima koneksi host lain, Anda harus terlebih dahulu memanggil bind () menetapkan alamat ke soket.

contoh sederhana adalah sebagai berikut:

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";

atau mati di alamat mengikat gagal eksekusi.

Dengan menetapkan pilihan SO_REUSEADDR setsockopt () untuk mengatur port dapat digunakan kembali segera.

pack_sockaddr_in () fungsi untuk mengkonversi alamat ke format biner.

mendengarkan () fungsi

Ketika soket dan alamat mengikat, mendengarkan () fungsi akan mulai mendengarkan permintaan sambungan mungkin. Namun, ini hanya dapat menjamin aliran data yang dapat diandalkan ketika menggunakan:

listen( SOCKET, QUEUESIZE );

SOCKET: deskriptor soket.

QUEUESIZE: integer adalah keputusan untuk memantau ukuran antrian, ketika ada permintaan sambungan tiba, itu akan memasuki mendengarkan antrian, ketika permintaan koneksi adalah menerima () untuk menerima, dihapus dari monitor antrian, ketika antrian penuh, koneksi baru permintaan akan kembali kesalahan.

Setelah sambungan diterima, itu kembali 0 untuk sukses, kesalahan kembali -1.

menerima () function

menerima () fungsi menerima permintaan koneksi soket. Jika berhasil dalam bentuk terkompresi alamat jaringan, jika tidak maka kembali PALSU:

accept( NEW_SOCKET, SOCKET );

SOCKET: deskriptor soket.

ALAMAT: ADDRESS adalah alamat soket (TCP / IP) mengandung tiga unsur:

  • Alamat keluarga (TCP / IP, adalah AF_INET, pada sistem Anda mungkin 2)

  • Nomor port (seperti 21)

  • alamat jaringan (seperti 10.12.12.168)

menerima () yang biasanya diterapkan dalam loop tak terbatas:

while(1) {
   accept( NEW_SOCKET, SOCKT );
   .......
}

Contoh di atas dapat memantau secara real time untuk permintaan klien.


fungsi klien

menghubungkan () fungsi

menghubungkan () system call untuk mendirikan sebuah soket parameter koneksi file descriptor dan alamat host.

connect( SOCKET, ADDRESS );

Berikut ini menciptakan koneksi soket ke server misalnya:

$port = 21;    #  ftp 端口
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
    or die "无法绑定端口! \n";

contoh lengkap

Selanjutnya kita datang untuk memahami semua fungsi aplikasi socket melalui contoh lengkap:

Server server.pl Code:

#!/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;
}

Buka terminal, jalankan kode berikut:

$ perl sever.pl
访问启动:7890

Klien client.pl Code:

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

Buka terminal lain, mengeksekusi kode berikut:

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