Perl - Soket Programlama
Soket nedir?
Soket, farklı işlemler arasında sanal çift yönlü bağlantı oluşturan bir Berkeley UNIX mekanizmasıdır. Bu daha sonra, farklı işletim sistemi yazılımlarında çalışan coğrafi konum boyunca sistemler arasında iletişimi sağlayan bilinen her işletim sistemine aktarıldı. Soket olmasaydı, sistemler arasındaki ağ iletişiminin çoğu asla olmayacaktı.
Daha yakından bakmak; bir ağdaki tipik bir bilgisayar sistemi, üzerinde çalışan çeşitli uygulamaların istediği şekilde bilgi alır ve gönderir. Bu bilgiler, kendisine benzersiz bir IP adresi atandığı için sisteme yönlendirilir. Sistem üzerinde bu bilgiler farklı portlardan dinleyen ilgili uygulamalara verilmektedir. Örneğin bir internet tarayıcısı, web sunucusundan alınan bilgi için port 80'i dinler. Ayrıca, belirli bir port numarası hakkında dinleyen ve bilgi gönderebilen / alabilen özel uygulamalarımızı yazabiliriz.
Şimdilik, bir soketin bir IP adresi ve bir bağlantı noktası olduğunu ve bağlantının bir ağ üzerinden veri gönderip almasını sağlayan bir bağlantı olduğunu özetleyelim.
Yukarıda bahsedilen soket kavramını açıklamak için, Perl kullanarak İstemci - Sunucu Programlamasının bir örneğini alacağız. Bir istemci sunucu mimarisini tamamlamak için aşağıdaki adımları izlememiz gerekir -
Sunucu Oluşturmak İçin
Kullanarak bir soket oluşturun socket aramak.
Soketi kullanarak bir port adresine bağlayın. bind aramak.
Port adresindeki soketi kullanarak dinleyin. listen aramak.
İstemci bağlantılarını kullanarak kabul edin accept aramak.
Müşteri Oluşturmak İçin
İle bir soket oluşturun socket aramak.
(Soketi) kullanarak sunucuya bağlayın connect aramak.
Aşağıdaki şema, İstemci ve Sunucu tarafından birbirleriyle iletişim kurmak için kullanılan aramaların tam sırasını göstermektedir -
Sunucu Tarafı Soket Çağrıları
Soket () çağrısı
socket()çağrı, bir ağ bağlantısı kurarken ilk çağrı bir soket oluşturmaktır. Bu çağrı aşağıdaki sözdizimine sahiptir -
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
Yukarıdaki çağrı bir SOCKET oluşturur ve diğer üç bağımsız değişken, TCP / IP bağlantıları için aşağıdaki değerlere sahip olması gereken tam sayılardır.
DOMAINPF_INET olmalıdır. Bilgisayarınızda muhtemelen 2'dir.
TYPE TCP / IP bağlantısı için SOCK_STREAM olmalıdır.
PROTOCOL olmalı (getprotobyname('tcp'))[2]. Soket üzerinden konuşulacak TCP gibi belirli bir protokoldür.
Dolayısıyla, sunucu tarafından verilen soket işlevi çağrısı şuna benzer bir şey olacaktır -
use Socket # This defines PF_INET and SOCK_STREAM
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
Bind () çağrısı
Socket () çağrısı tarafından oluşturulan soketler bir ana bilgisayar adına ve bir bağlantı noktası numarasına bağlanana kadar işe yaramaz. Sunucu aşağıdakileri kullanırbind() istemcilerden gelen bağlantıları kabul edecekleri bağlantı noktasını belirtmek için işlev.
bind( SOCKET, ADDRESS );
Burada SOCKET, socket () çağrısı tarafından döndürülen tanımlayıcıdır ve ADDRESS, üç öğe içeren bir soket adresidir (TCP / IP için) -
Adres ailesi (TCP / IP için bu AF_INET, muhtemelen sisteminizde 2'dir).
Bağlantı noktası numarası (örneğin 21).
Bilgisayarın internet adresi (örneğin 10.12.12.168).
Bind (), kendi adresini bilmesi gerekmeyen bir sunucu tarafından kullanıldığı için argüman listesi şöyle görünür -
use Socket # This defines PF_INET and SOCK_STREAM
$port = 12345; # The unique port used by the sever to listen requests
$server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "Can't bind to port $port! \n";
or die cümleciği çok önemlidir, çünkü bir sunucu bekleyen bağlantılar olmadan ölürse, SO_REUSEADDR seçeneğini kullanmadığınız sürece bağlantı noktası hemen yeniden kullanılamaz. setsockopt()işlevi. Burayapack_sockaddr_in() işlevi, Bağlantı Noktası ve IP adresini ikili biçime paketlemek için kullanılıyor.
Listen () çağrısı
Bu bir sunucu programı ise, bir çağrı yapılması gerekir. listen()Dinlemek için belirtilen port üzerinde, yani gelen istekleri bekleyin. Bu çağrı aşağıdaki sözdizimine sahiptir -
listen( SOCKET, QUEUESIZE );
Yukarıdaki çağrı, socket () çağrısı tarafından döndürülen SOCKET tanımlayıcısını kullanır ve QUEUESIZE, aynı anda izin verilen maksimum bağlantı isteği sayısıdır.
Kabul () çağrısı
Bu bir sunucu programı ise, o zaman access()gelen bağlantıları kabul etme işlevi. Bu çağrı aşağıdaki sözdizimine sahiptir -
accept( NEW_SOCKET, SOCKET );
Kabul çağrısı, socket () işlevi tarafından döndürülen SOCKET tanımlayıcısını alır ve başarıyla tamamlandıktan sonra, istemci ile sunucu arasındaki gelecekteki tüm iletişim için yeni bir soket tanımlayıcısı NEW_SOCKET döndürülür. Access () çağrısı başarısız olursa, başlangıçta kullandığımız Socket modülünde tanımlanan FLASE'i döndürür.
Genellikle, accept () sonsuz bir döngüde kullanılır. Bir bağlantı ulaşır ulaşmaz, sunucu ya onunla başa çıkmak için bir alt süreç yaratır ya da kendisine hizmet eder ve sonra daha fazla bağlantı için dinlemeye geri döner.
while(1) {
accept( NEW_SOCKET, SOCKT );
.......
}
Şimdi sunucu ile ilgili tüm görüşmeler bitti ve müşteri tarafından istenecek bir görüşme görelim.
İstemci Tarafı Soket Çağrıları
Connect () çağrısı
Müşteri programı hazırlayacaksanız, önce kullanacaksınız socket() bir soket oluşturmak için çağırın ve sonra kullanmanız gerekir connect()sunucuya bağlanmak için arayın. Soket () çağrısı sözdizimini zaten gördünüz ve sunucu socket () çağrısına benzer kalacaktır, ancak burada sözdizimiconnect() ara -
connect( SOCKET, ADDRESS );
Burada SCOKET, istemci tarafından verilen soket () çağrısı tarafından döndürülen soket tanımlayıcısıdır ve ADDRESS, uzak sunucunun IP adresini içermesi dışında bağlama çağrısına benzer bir soket adresidir .
$port = 21; # For example, the ftp port
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "Can't connect to port $port! \n";
Sunucuya başarılı bir şekilde bağlanırsanız, SOCKET tanımlayıcısını kullanarak komutlarınızı sunucuya göndermeye başlayabilirsiniz aksi takdirde istemciniz hata mesajı vererek çıkacaktır.
İstemci - Sunucu Örneği
Aşağıda, Perl soketini kullanarak basit bir istemci-sunucu programı uygulamak için bir Perl kodu verilmiştir. Burada sunucu gelen istekleri dinler ve bağlantı kurulduktan sonra, sadece Smile'ı sunucudan yanıtlar . Müşteri bu mesajı okur ve ekrana yazdırır. Sunucumuz ve istemcimizin aynı makinede olduğunu varsayarak, nasıl yapıldığını görelim.
Sunucu Oluşturma Komut Dosyası
#!/usr/bin/perl -w
# Filename : server.pl
use strict;
use Socket;
# use port 7890 as default
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost"; # Host IP running the server
# create a socket, make it reusable
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
or die "Can't set socket option to SO_REUSEADDR $!\n";
# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't bind to port $port! \n";
listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n";
# accepting a connection
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 "Smile from the server";
print "Connection recieved from $name\n";
close NEW_SOCKET;
}
Sunucuyu arka plan modunda çalıştırmak için Unix isteminde aşağıdaki komutu verin -
$perl sever.pl&
İstemci Oluşturma Komut Dosyası
!/usr/bin/perl -w
# Filename : client.pl
use strict;
use Socket;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost"; # Host IP running the server
# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't connect to port $port! \n";
my $line;
while ($line = <SOCKET>) {
print "$line\n";
}
close SOCKET or die "close: $!";
Şimdi sunucumuza bağlanacak ve sunucu tarafından gönderilen mesajı okuyacak ve ekranda aşağıdaki gibi görünen komut isteminde istemcimizi başlatalım -
$perl client.pl
Smile from the server
NOTE - Gerçek IP adresini noktalı gösterimle veriyorsanız, karışıklığı önlemek için hem istemcide hem de sunucuda aynı formatta IP adresi sağlamanız önerilir.