Доброе время!
Решил попробывать socket в Perl.
Списал пример:
use strict;
use Socket;
use Fcntl;
use Errno;
my $proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
my $sin = sockaddr_in(25, inet_aton('192.168.0.100'));
# bind можно опустить, тогда будет неявно вызван
# bind(SOCK, sockaddr_in(0, INADDR_ANY))
# Теперь переводим сокет в non-block mode
fcntl(SOCK, F_SETFL, O_NONBLOCK) or die "fcntl: $!";
unless (connect(SOCK, $sin)) {
# Hекоторые системы возвращают EWOULDBLOCK вместо EINPROGRESS
Errno::EINPROGRESS == $! or Errno::EWOULDBLOCK or
die "connect: $!";
vec(my $win = '', fileno(SOCK), 1) = 1;
# Таймаут соединения - десять с половиной секунд
unless (select(undef, $win, undef, 10.5)) {
close (SOCK);
die "Time is out!\n";
}
if (defined (my $ret = getsockopt(SOCK, SOL_SOCKET, SO_ERROR))) {
die "connection failed: $!" if $! = unpack('i', $ret);
# Hе во всех системах поддерживается SO_ERROR
# fallback до getpeername
} elsif (!getpeername(SOCK)) {
die "connection failed: $!";
}
}
fcntl(SOCK, F_SETFL, 0);
my $data=<SOCK>;
print $data;
print SOCK "helo server";
Данные получаю. А вот передать не удается. Пробывал еще короче скрипт - таже история.
Попробывал через set устанвливать размер буферов
my $opis = 0;
my $new_ret = pack('i',$opis);
setsockopt(SOCK, SOL_SOCKET, SO_SNDBUF, $new_ret);
setsockopt(SOCK, SOL_SOCKET, SO_RCVBUF, $new_ret);
все равно сервер ничего не получает.
Откройте тайну, пожалуйста, что проморгал?