in reply to Perl an array of sockets

a javascript code sends a simple string and I don't know how to open it, instead I receive html headers
That's not really surprising. I assume your script runs in a browser and thus speaks HTTP to your sockets, so that's what you get. A raw HTTP request. You really should not try to implement HTTP yourself. If you don't know how to use a specific module, we can help you with that.

Edit: Sometimes it helps if you try to explain your actual problem and not asking how to fix a (possibly broken) attempt to solve it.


holli

You can lead your users to water, but alas, you cannot drown them.

Replies are listed 'Best First'.
Re^2: Perl an array of sockets
by suhijo (Novice) on Nov 20, 2017 at 22:48 UTC

    Perhaps people can help me with this code... it's much simpler than previous but I am unable to get ip, port and won't send message or close socket... seems like does nothing... maybe I am not saving socket correctly or not referencing correctly.

    use EV; use Asterisk::AMI; use Data::Dumper; use Net::WebSocket::EV; use HTTP::Server::EV; use Digest::SHA1 qw(sha1_base64); use threads; use threads::shared; use strict; $|++; my ($rsv,$opcode,$msg, $status_code); our @users : shared; my @users =(); my $cgi ; my $astman = Asterisk::AMI->new(PeerAddr => '127.0.0.1', PeerPort => '5038', Username => 'admin', Secret => 'emel1t0', Events => 'on', Handlers => { default => \&eventhandler } ); die "Unable to connect to asterisk" unless ($astman); sub eventhandler { my ($ami, $event) = @_; if($event->{'Event'} eq "Dial"){ if($event->{'SubEvent'} eq "Begin"){ &buscar_exten($event->{'ConnectedLineName'}); } if($event->{'SubEvent'} eq "End"){ &buscar_exten($event->{'ConnectedLineName'}); } } } HTTP::Server::EV->new->listen(50080, sub { $cgi = $_[0]; $cgi->header({ STATUS => '101 Switching Protocols', Upgrade => "websocket", Connection => "Upgrade", "Sec-WebSocket-Accept" => scalar sha1_base64( $cgi->{headers}{"Sec-WebSocket-Key"} . "2 +58EAFA5-E914-47DA-95CA-C5AB0DC85B11" ).'=', }); $cgi->{self} = $cgi; $cgi->{buffer}->flush_wait(sub { $cgi->{websocket} = Net::WebSocket::EV::Server->new({ fh => $cgi->{buffer}->give_up_handle, on_msg_recv => sub { ($rsv,$opcode,$msg,$status_code) = @_; my @dlogin=split(":",$msg); if(@dlogin[1] eq ""){ print "no autenticado\n"; } else{ push (@users, $cgi->{websocket}) +; } }, on_close => sub { my($code) = @_; $cgi->{self} = undef; $cgi = undef; }, buffering => 1, }); }); }, { threading => 0 }); sub buscar_exten{ my $exten=@_[0]; my $href; my $role; my $some; print "buscando si <$exten> esta logueada-\n"; foreach my $fn (@users) { open my $fh, ">&=$fn" ;# or warn $! and die; send($fh,"evento llamada $exten\n",0) ; print "}\n"; } } EV::loop;
      I'm quite unclear what you mean by
      unable to get ip, port and won't send message or close socket.
      What is the output when you run this? Is there an Asterisk server listening at the port/ip you provided?


      holli

      You can lead your users to water, but alas, you cannot drown them.

        It runs , When I open my webpage, websocket it's open... when I make a call, events are catched by eventhandler and call the subprocess "buscar_exten" but... no message is send to the clients "send($c,"mandando mensaje 1000\r\n",0)" connected to the websocket service, what I mean is the perl code at the top is similar but at least I can get the ip and port calling "peerhost()" and "peerport()" and when I open the socket in the "buscar_exten" at least close the socket, but the second code does nothing.

        I need when an event is received by eventhandler subprocess, send a message to the connected clients thru the websocket. The first perl code I use IO:Socket but harder to create websocket, second it's easier but still no luck.

        I need to create an array/hash of sockets and then when an event occurs in asterisk being able to send it thru sockets.