Perl İle Sunucu-İstemci Alışverişi
server.pl
#!/usr/bin/perl -s
# Author: Hamdi Kavak
# Date : 08 December 2007 - 10:04 PM
#####################################################################################
# - TCP/IP tabninda calisan bir sunucu programdir. Ayni anda tek baglanti yapilabilir.
# - Varsayilan port: 5555, sunucu adi: localhost
# - Baglanti kuruldugunda istemciden istek bekler
# * cikis, isletim sist bilgisi, calisilan dizin komutlari algilanabilir
#####################################################################################
###--- Moduller ----###
use Socket; # soket fonksiyonlarini saglayan modul
use Cwd;
###--- Ana Program ---###
$server_port = "5555"; # Varsayilan port numarasi ataniyor
$server_name = "localhost"; # Varsayilan sunucu adi degeri ataniyor
print "\nSunucu adi:port numarasini giriniz. Varsayilan icin enter (localhost:5555): ";
unless( ($input = <STDIN>) eq "\n" ) {
chomp $input;
($server_name, $server_port) = split /:/, $input; # : ile degerleri ayir
}
$ipaddress = inet_aton($server_name);
$server_address = sockaddr_in($server_port, INADDR_ANY);
$protocol = getprotobyname("tcp");
my $dir = &cwd;
print STDOUT "\nSunucunun calistigi dizin : \"$dir\" \n";
print STDOUT "Perl'un sunucusunun adresi : $ipaddress\n";
print STDOUT "Perl'un tam adresi: \"$server_address\"\n";
print STDOUT "Sunucu: $server_name\tPort: $server_port\n";
socket(SERVER, PF_INET, SOCK_STREAM, $protocol) || die ("Soket olusturulamadi: $!");
print STDOUT "$server_name uzerinde soket olusturuldu...\n";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1); # Simdi sunucumuzun kolayca baslatabiliriz
select(SERVER); # SERVER'i varsayilan tasiyici yaptik
$| = 1; # Tamponunu temizle
bind(SERVER, $server_address) or die "$server_port numarali porta baglanilamiyor: $!\n";
print STDOUT "... soketimiz $server_port numarali porta baglandi ...\n";
listen(SERVER, SOMAXCONN) or die "$server_port numarali port dinlenemiyor: $!\n";
print STDOUT "... $server_name, $server_port numarali portu dinlemeye basladi...\n";
my $counter=0;
while (accept(CLIENT, SERVER)){ # Baglantilari kabul et
select (CLIENT); # SERVER'i varsayilan tasiyici yaptik
$| = 1; # Tamponunu temizle
while(($intext = <CLIENT>)){
$counter++;
$respond_message="Sunucu uzerindesiniz $counter";
if($intext =~ m/^(q|Q|(quit)|(Quit)|(QUIT)|\\n)/) { # gonderilen satirda cikmak mi istemis?
print STDOUT "Istemci ayriliyor\n"; # sunucu programin ekranina komutu yazdir
last;
}
elsif($intext =~ m/^(os|OS)/) { # gonderilen satirda isletim sistemini mi ogrenmek istemis?
print STDOUT "Istemci isletim sitemimi ogrenmek istedi\n"; # sunucu programin ekranina komutu yazdir
$respond_message="Uzerinde calistigim platform : $^O";
}
elsif($intext =~ m/^(wd|WD|cwd|CWD|pwd|PWD)/) { # gonderilen satirda dizin adresini mi ogrenmek istemis?
print STDOUT "Istemci dizin adresini ogrenmek istedi\n"; # sunucu programin ekranina komutu yazdir
$respond_message="Uzerinde calistigim dizin : $dir";
}print STDOUT "=>", $intext; # sunucu programin ekranina istemciden geleni yazdir
print CLIENT "$respond_message\n"; # Istemciye bir satirlik cevap gonder
}
}
close(SERVER);
client.pl
#!/usr/bin/perl -s
# Author: Hamdi Kavak
# Date : 08 December 2007 - 11:13 PM
#####################################################################################
# - TCP/IP tabninda calisan bir istemci programdir. Ayni anda tek baglanti yapilabilir.
# - Varsayilan port: 5555, sunucu adi: localhost
# - Sunucuya isteklerde bulunur, eger cikis isteginde bulunulursa program sonlandirilir
#####################################################################################
###--- Moduller ----###
use Socket;
###--- Ana Program ---###
$remote_port = "5555"; # Varsayilan port numarasi ataniyor
$remote_host = "localhost"; # Varsayilan sunucu adi degeri ataniyor
print "\nBaglanacagini sunucu adi:port numarasini giriniz. Varsayilan icin enter (localhost:5555): ";
unless( ($input = <STDIN>) eq "\n" ) {
chomp $input;
($remote_host, $remote_port) = split /:/, $input; # : ile degerleri ayir
}
print STDOUT "Baglaniyor => Sunucu: $remote_host\tPort: $remote_port\n";
$protocol = getprotobyname("tcp");
$ipaddress = inet_aton($remote_host) or die "$remote_host girdisi internet adresine donusturulemiyor: $!\n";;
$paddress = sockaddr_in($remote_port, $ipaddress);
print STDOUT "Perl'un IP-adresini kendi icindeki gosterimi : $ipaddress\n";
print STDOUT "Perl'un tam adresi kendi icindeki gosterimi : $paddress\n";
socket(TO_SERVER, PF_INET, SOCK_STREAM, $protocol) or die ("Soket olusturulamadi : $!");
print STDOUT "... soket olusturuldu ...\n";
connect(TO_SERVER, $paddress) or die ("$remote_host uzerine $remote_port portundan baglanti yapilamadi: $!");
print STDOUT "... baglanti kuruldu ...\n";
select(TO_SERVER); # SERVER'i varsayilan tasiyici yaptik
$| = 1; # Tamponunu temizle
print STDOUT "\n$remote_host:$remote_port baglantisi yapildi.";
print STDOUT "Merhaba. Bu bir istemci cagrisi\n";
print TO_SERVER "Merhaba. Bu bir istemci cagrisi\n"; #sunucuya
$input = <TO_SERVER>; # sunucudan girdi al
print STDOUT "Sunucudan bir mesaj var: $input\n"; # kendi ekranimizda girdiyi goster
print STDOUT "Cevap yaziniz => ";
while( defined($to_server = <STDIN>) ) {
if ($to_server eq "\n" or $to_server =~ m/^(q|Q|(quit)|(Quit)|(QUIT)|\\n)/) {#girdigimiz istegin ne oldugunu kontrol ediyoruz
print STDOUT "... baglanti kapaniyor ...\n";
print TO_SERVER " istemci ayriliyor \n";
close TO_SERVER;
last;
}
print TO_SERVER "$to_server"; # sunucuya kullanicimizdan gelen istegi gonderiyoruz
$input = <TO_SERVER>; # sunucudan karsiligini al
chomp $input;
print STDOUT "\nSunucu istege cevap verdi: $input"; #print server response locally
print STDOUT "\nIstekte bulununuz => "
}
print STDOUT "Alinan son mesaj $to_server\n";
print TO_SERVER "quit\n";
close TO_SERVER; # baglantiyi kapattigimizi garanti altina aliyoruz