Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 简单websocket服务器从头开始无法工作_Perl_Websocket - Fatal编程技术网

Perl 简单websocket服务器从头开始无法工作

Perl 简单websocket服务器从头开始无法工作,perl,websocket,Perl,Websocket,从头开始使用perl创建了一个简单的websocket服务器,当从Chrome(通过使用)指向它时,在websocket握手过程中得到错误错误:错误的“Sec websocket Accept”头值 非常确定websocket握手返回的密钥是正确的。有什么想法吗 use IO::Socket; use IO::Select; use Digest::SHA1 qw(sha1 sha1_hex sha1_base64); $servSock = IO::Socket::INET->ne

从头开始使用perl创建了一个简单的websocket服务器,当从Chrome(通过使用)指向它时,在websocket握手过程中得到错误
错误:错误的“Sec websocket Accept”头值

非常确定websocket握手返回的密钥是正确的。有什么想法吗

use IO::Socket;
use IO::Select;
use Digest::SHA1  qw(sha1 sha1_hex sha1_base64);


$servSock = IO::Socket::INET->new( Proto    => 'tcp',
                                 LocalPort => 8080,
                                Reuse     => 1,
                                Listen    => 500
   ) || die "failed to setup outsock $@\n";
$s = IO::Select->new();
$s -> add ($servSock);
my @readySocks;
while (1) {
   @readySocks = $s->can_read(5);
   foreach $sock (@readySocks) {
      if ($sock eq $servSock)
      {
          #print "inSock\n";
          $clientSock = $servSock->accept();
          setsockopt($clientSock, IPPROTO_TCP, TCP_NODELAY, 1);
          $s->add ($clientSock);
      } else
      {
         #print "outsock\n";
        $buff = "";
         $fromAddr = recv $sock, $buff, 1470, 0;
         if (length($buff) <= 0)
         {
             $s->remove($sock);
             close $sock; $numOfConns --;
             next;
         }
         printf "recved %d bytes\n", length($buff);
         if ($buff =~ /Sec-WebSocket-Key: (\S+)/) {
             $str = $1;
             print "key is $str|\n";
             my $str = sha1_base64($str . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
             send ($sock, qq{HTTP/1.1 101 Switching Protocols\r
Connection: Upgrade\r
Upgrade: websocket\r
Sec-Websocket-Accept: $str\r
\r\n}, 0);
         }
      }
   }
}
to(注意,
$str
现在是
$str=

使其工作。

来自:

请注意,返回的base64编码字符串未填充为4字节长的倍数。如果希望与其他base64编码的sha1摘要具有互操作性,则可能需要在结果中添加冗余字符串“=”

如前所述添加“=”是您的代码缺少的内容

send ($sock, qq{HTTP/1.1 101 Switching Protocols\r
Connection: Upgrade\r
Upgrade: websocket\r
Sec-Websocket-Accept: $str\r
\r\n}, 0);
send ($sock, qq{HTTP/1.1 101 Switching Protocols\r
Connection: Upgrade\r
Upgrade: websocket\r
Sec-Websocket-Accept: $str=\r
\r\n}, 0);