LINUX.ORG.RU

клиент и сервер на Перл


0

0

Сразу извинюсь так как я запускаю скрипт на виндах а форум посвящён линуксу. просто на 2 других форумах программистов мне не смогли помочь

вот сервер

#!/usr/bin/perl
use Socket;
use IO::Handle;
socket(SERVER, AF_INET, SOCK_STREAM, getprotobyname('tcp'));
setsockopt(SERVER, SOL_SOCKET, SO_REUSADDR, 1);
bind (SERVER, sockaddr_in( 2000, INADDR_ANY));
listen (SERVER,SOMAXCONN);
warn "waiting for incoming connections... \n";
while(1){
	next unless my $remote_addr = accept(SESSION, SERVER);
	warn "Connection \n";
	if(fork==0){
		SESSION->autoflush(1);
		while(<SESSION>){
			chomp($_);
			print SESSION "(".$_.")\n";	}
		print "Connection finished\n";
		exit 0;}}
close SERVER;

вот клиент

#!/usr/bin/perl
use Socket;
use IO::Handle;
socket(CLIENT, AF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect(CLIENT, sockaddr_in(2000,inet_aton('127.0.0.1')));
CLIENT->autoflush(1);
my $child=fork();
if($child){
	print "main started:\n";
	syswrite(CLIENT,$data) while sysread(STDIN,$data,1024);}
else{
	print "child started:\n";
	syswrite(STDOUT,$data) while sysread(CLIENT,$data,1024);}
close CLIENT;

в кратце логика: сервер висит на 2000 порту, принимает от клиента строчку текста потом отправляет её обратно клиенту. клиент когда подключается к серверу делится на 2 процесса 1 процесс читает с клавиатуры и отправляет серверу 2 процесс слушает сервер и выводит на монитор проблема в том что когда клиент отправляет первую строчку текста он виснет. думаю проблема в том что 2 процесса клиента вместе используют <CLIENT> так как если один процесс отключить 2 нормально работает но в чём именно проблема понять не могу. заранее спс за помощь

★★★★★

Наводящи1 вопрос:

sysread(STDIN,$data,1024);

А что будет если из STDIN читается менее 1024 байт(подаётся на вход скрипта менее 1024 байт)?

saluki
()
Ответ на: комментарий от iSage

sysread читает столько сколько доступно в отличае от read которая ждёт пока не наберётся указанное число байт.

так в чём у меня ошибка можете сказать? или хотя бы подскажите на какую тему перечитать учебник?

TDrive ★★★★★
() автор топика

в целом:
у вас опечатка в сервере:
s/SO_REUSADDR/SO_REUSEADDR/;

и ошибка с областью видимости переменной в клиенте.

как я уже и говорил - используйте use strict; оно вам подскажет.

iSage ★★★★
()

эти ошибки исправил и всё что вывел strict тоже исправил но проблема осталась. мне кажется клиент зависает из за того что оба процесса и читают и записывают в дескриптор CLIENT. так как если один процесс убрать всё работает нормально. но что именно и как исправить понять не могу.

TDrive ★★★★★
() автор топика
Ответ на: комментарий от TDrive

покажите, как исправили.
вот так у меня работает:
if($child){
   print "main started:\n";
   my $data;
   syswrite(CLIENT,$data) while sysread(STDIN,$data,1024);}
else{
   print "child started:\n";
   my $data;
   syswrite(STDOUT,$data) while sysread(CLIENT,$data,1024);}
close CLIENT;

iSage ★★★★
()
Ответ на: комментарий от iSage

в общем постовил линукс запустил всё работает. перешел на винду запускаю виснет. тут видимо дело не в самой программе а в интерпретаторе или в самих виндах. так что теперь буду только под линукс писать на перле. оказалось в линуксе всё сделано намного проще и логичнее чем винде.

TDrive ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.