Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > non-fork TCP server, помогите пожалуйста.


Автор: loginn 8.9.2011, 12:25
Суть проблемы:
1. Открываю новую сессию. 
2. Вбиваю:  nc 127.0.0.10 55555

Все ок, сервер выводит:
10
New connection...
Waiting new data in descriptors...



Но если продолжаю в netcat писать что-то и отправлять серверу, то сервер этого не выводит, хотя по логике скрипта должен выводить, т.к. стоит проверка того, есть ли данные в дескрипторе SOCKET.


Вот код tcp сервера (сервер на основе мультиплексирования ввода-вывода):
Код

#!/usr/bin/perl
use Socket;

$rin =  '';
$|=1;

$LSOCK = &start_tcp_server ('tcp', '127.0.0.10', '55555');
select((select($LSOCK), $|=1)[0]);
vec ($rin, fileno($LSOCK), 1) = 1;

while (select ($rout=$rin, undef,undef,undef)) {
  if (vec ($rout, fileno($LSOCK), 1)) {
      accept (SOCKET, $LSOCK);
      select((select(SOCKET), $|=1)[0]);
      vec ($fh, fileno(SOCKET), 1) = 1;
      print vec ($rout, fileno($LSOCK), 1), vec ($rout, fileno(SOCKET), 1), "\n", "New connection...\n";
  }
  if (vec ($rout, fileno(SOCKET), 1)) {
      recv (SOCKET, $msg, 1024, 0);
      print  "recv:$msg\n";
  }
  print "Waiting new data in descriptors...\n";
}    


sub start_tcp_server {   
  my ($socket, $protocol, $ip_addr, $port, $binary_ip, $sockaddr_in);
    
  ($protocol, $ip_addr, $port) = @_;
      
  if ($protocol =~ /^tcp$/i) {print "Error! Code: $!" unless (socket($socket, 2, 1, 6));}    
  
  $binary_ip = inet_aton($ip_addr);
  $sockaddr_in = pack_sockaddr_in ($port, $binary_ip);
  
  bind ($socket, $sockaddr_in);
  listen ($socket, 128);
  return $socket if $socket;
}

Автор: loginn 8.9.2011, 14:16
все нашел ошибку. smile
вопрос снят.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)