加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 从头开始??的简单websocket服务器无效

发布时间:2020-12-16 06:21:18 所属栏目:大数据 来源:网络整理
导读:使用perl从头开始创建一个简单的websocket服务器,当从Chrome指向它时(使用 echo test),在WebSocket握手期间出现错误错误:错误的’Sec-WebSocket-Accept’标头值. 很确定为websocket握手返回的密钥是正确的.有任何想法吗? use IO::Socket;use IO::Select;us
使用perl从头开始创建一个简单的websocket服务器,当从Chrome指向它时(使用 echo test),在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 "inSockn";
          $clientSock = $servSock->accept();
          setsockopt($clientSock,IPPROTO_TCP,TCP_NODELAY,1);
          $s->add ($clientSock);
      } else
      {
         #print "outsockn";
        $buff = "";
         $fromAddr = recv $sock,$buff,1470,0;
         if (length($buff) <= 0)
         {
             $s->remove($sock);
             close $sock; $numOfConns --;
             next;
         }
         printf "recved %d bytesn",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 Protocolsr
Connection: Upgrader
Upgrade: websocketr
Sec-Websocket-Accept: $strr
rn},0);
         }
      }
   }
}

注意:我需要从头开始创建一个作为另一个项目的一部分.

更新

感谢@ steffen-ullrich的建议,将其改为

send ($sock,0);

to(注意$str现在是$str =)

send ($sock,qq{HTTP/1.1 101 Switching Protocolsr
Connection: Upgrader
Upgrade: websocketr
Sec-Websocket-Accept: $str=r
rn},0);

使它工作.

解决方法

从 documentation of sha1_bas64:

Note that the base64 encoded string returned is not padded to be a multiple of 4 bytes long. If you want interoperability with other base64 encoded sha1 digests you might want to append the redundant string “=” to the result.

并且如上所述添加’=’是您的代码缺失的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读