Latest web development tutorials

Programmation Perl Socket

Socket également connu sous le nom "socket", la demande est généralement délivré par un "socket" à la demande de demande de réseau ou d'un réseau de réponse, de sorte que le processus entre les hôtes ou entre un ordinateur peut communiquer.

Cette section est que nous avons reçu langage Perl comment utiliser les services de Socket.


Créer serveur

  • Utilisez la fonctionde prise pour créer un service de socket.

  • Utilisez la fonctionde liaison pour lier le port.

  • Utilisezlisten fonction de port.

  • Utilisezaccepte fonction reçoit les demandes des clients.

Créer un client

  • Utilisez la fonctionde prise pour créer un service de socket.

  • Utilisation de la fonction deconnexion pour se connecter à la prise du serveur.

Le tableau suivant illustre le flux de communication entre le client et le serveur:


fonction socket serveur

fonction socket

Perl, nous utilisons la fonction socket () pour créer une socket, la syntaxe est la suivante:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Paramètres analytiques:

  • Indique le protocole défini socket DOMAIN créé. Par exemple:

    • AF_INET indique le protocole réseau IPv4
    • AF_INET6 pour IPv6
    • AF_UNIX représente socket local ( à l' aide d' un fichier)

  • type de socket de type peut être orienté connexion ou sans connexion en SOCK_STREAM ou SOCK_DGRAM

  • PROTOCOLE devrait être(getprotobyname ( 'tcp')) [2].Spécifiez le protocole de transport réel.

Donc, l'appel de fonction de socket comme suit:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

fonction bind ()

Utilisez bind () attribuer une adresse à la prise:

bind( SOCKET, ADDRESS );

Châsse un descripteur de socket. ADRESSE est l'adresse de socket (TCP / IP) contient trois éléments:

  • Adresse famille (TCP / IP, est AF_INET, sur votre système peut être 2)

  • Numéro de port (tel que 21)

  • Adresse réseau (comme 10.12.12.168)

Après avoir utilisé le socket () crée une socket, juste donner le protocole qu'ils utilisent et n'attribue pas les adresses. Avant d'accepter l'autre connexion d'hôte, vous devez d'abord appeler bind () attribuer une adresse à une prise.

Des exemples simples sont les suivantes:

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

ou mourir dans l'adresse de liaison a échoué exécution.

En réglant le setsockopt () option SO_REUSEADDR pour définir le port peut être réutilisé immédiatement.

fonctionpack_sockaddr_in () pour convertir les adresses au format binaire.

fonction listen ()

Fonction Lorsque la douille et une adresse de liaison, listen () va commencer à écouter les demandes de connexion possibles. Cependant, cela ne peut garantir flux de données fiables lors de l'utilisation:

listen( SOCKET, QUEUESIZE );

SOCKET: un descripteur de socket.

QUEUESIZE: integer est une décision de surveiller la taille de la file d'attente, quand il y a une demande de connexion arrive, il va entrer dans la file d'attente d'écouter, quand une demande de connexion est accept () pour accepter, retiré de l'écran de file d'attente, quand la file d'attente est pleine, de nouvelles connexions demande renverra une erreur.

Une fois que la connexion est acceptée, elle renvoie 0 pour le succès, le retour d'erreur -1.

fonction accept ()

fonction accept () accepte la demande de connexion de socket. En cas de succès sous forme comprimée l'adresse réseau, sinon il retourne FALSE:

accept( NEW_SOCKET, SOCKET );

SOCKET: un descripteur de socket.

ADRESSE: ADRESSE est l'adresse de socket (TCP / IP) contient trois éléments:

  • Adresse famille (TCP / IP, est AF_INET, sur votre système peut être 2)

  • Numéro de port (tel que 21)

  • Adresse réseau (comme 10.12.12.168)

accept () qui est généralement appliqué dans une boucle infinie:

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

Les exemples ci-dessus peuvent suivre en temps réel aux demandes des clients.


fonctions Client

fonction connect ()

connect () appel système à mettre en place une prise paramètres de connexion descripteur de fichier et l'adresse de l'hôte.

connect( SOCKET, ADDRESS );

L'exemple suivant crée une connexion socket à l'instance de serveur:

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

exemple complet

Ensuite, nous arrivons à comprendre toutes les fonctions des applications de socket par un exemple complet:

Serveur Code 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;
}

Ouvrez un terminal, exécutez le code suivant:

$ perl sever.pl
访问启动:7890

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

Ouvrez un autre terminal, exécutez le code suivant:

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