我正在使用IO :: Socket :: Async在P6中重写我的P5套接字服务器,但收到的数据在结尾处被截断1个字符,并且在下一个连接上收到1个字符.来自Perl6 Facebook组的人(Jonathan Worthington)指出,这可能是由于字符串的性质和字节在P6中的处理方式截然不同.引:
在Perl 6中,字符串和字节的处理方式截然不同.值得注意的是,字符串在字形级别上起作用.接收Unicode数据时,不仅可能将多字节序列分组,还可以分割多码点序列.例如,一个数据包的末尾可能包含字母"a",而下一个数据包可能是组合的重音符号.因此,它不能安全地传递"a",直到看到下一个数据包如何开始.
我的P6正在MoarVM上运行
use Data::Dump;
use experimental :pack;
my $socket = IO::Socket::Async.listen('0.0.0.0', 7000);
react {
whenever $socket -> $conn {
my $line = '';
whenever $conn {
say "Received --> "~$_;
$conn.print: &translate($_) if $_.chars ge 100;
$conn.close;
}
}
CATCH {
default {
say .^name, ': ', .Str;
say "handled in $?LINE";
}
}
}
sub translate($raw) {
my $rawdata = $raw;
$raw ~~ s/^\s+|\s+$//; # remove heading/trailing whitespace
my $minus_checksum …
Run Code Online (Sandbox Code Playgroud) 我在perl中使用套接字连接编写一个简单的代码:
$sock = new IO::Socket::INET(
PeerAddr => '192.168.10.7',
PeerPort => 8000,
Proto => 'tcp');
$sock or die "no socket :$!";
Run Code Online (Sandbox Code Playgroud)
然后使用循环发送数据:
while...
print $sock $str;
...loop
Run Code Online (Sandbox Code Playgroud)
有没有办法在循环中插入一个命令来检查连接?就像是:
while...
socket is up?
yes => send data
no => connect again and the continue with loop
...loop
Run Code Online (Sandbox Code Playgroud)
编辑添加我的代码:
my $sock = new IO::Socket::INET(
PeerAddr => '192.168.10.152',
PeerPort => 8000,
Proto => 'tcp');
$sock or die "no socket :$!";
open(my $fh, '<:encoding(UTF-8)', 'list1.txt')
or die "Could not open file $!";
while (my $msdn …
Run Code Online (Sandbox Code Playgroud) 我有一个使用IO :: Socket :: Async和Redis :: Async进行消息发布的套接字服务器.只要服务器收到消息,脚本就会转换消息并生成确认消息以发送回发送方,以便发送方发送后续消息.由于翻译消息非常昂贵,因此脚本将在"start"方法下运行该部分.但是,我注意到Moar进程正在运行我的RAM.有什么想法我应该在哪里解决这个问题?谢谢!
use v6;
use Data::Dump;
use experimental :pack;
use JSON::Tiny;
use Redis::Async;
constant $SOCKET_PORT = 7000;
constant $SOCKET_ADDR = '0.0.0.0';
constant $REDIS_PORT = 6379;
constant $REDIS_ADDR = '127.0.0.1';
constant $REDIS_AUTH = 'xxxxxxxx';
constant $IDLING_PERIOD_MIN = 180 - 2; # 3 minutes - 2 secs
constant $CACHE_EXPIRE_IN = 86400; # 24h hours
# create socket
my $socket = IO::Socket::Async.listen($SOCKET_ADDR, $SOCKET_PORT);
# connnect to Redis ...
my $redis;
try {
my $error-code = "110";
$redis …
Run Code Online (Sandbox Code Playgroud) 如果我这样尝试:
my $sock = IO::Socket::INET->new( … ) or die "no socket for you";
defined $sock->setsockopt(SOL_SOCKET, SO_RCVTIMEO, 30) or die "setsockopt: $!";
Run Code Online (Sandbox Code Playgroud)
然后我的脚本因“setsockopt:[第 2 行] 处的无效参数”而死亡。在IO::Socket
和perlfunc
豆荚不说,虽然perlfunc给出了一个例子TCP_NODELAY
,这使它看起来像上面应该工作。
(快速说明:我已经尽我所能回答了我自己的问题,但当然欢迎更好的答案。最明显的“更好”是它具有便携性,至少在 POSIX 机器上)
我有以下代码(较大的脚本的一部分)
my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => 0); # just use any available port.
$port = $lsn->sockport();
Run Code Online (Sandbox Code Playgroud)
我收到了错误Can't call method "sockport" on an undefined value
.
文档IO::Socket::INET
中没有说明这个问题:https://perldoc.perl.org/IO/Socket/INET.html(有更好的地方看吗?不太熟悉这个模块).
奇怪的是,我最近改变了这一点,然后它传递了一个非零的,随机生成的端口号,并且当端口被使用时有时会中断.
我测试了0
在我的本地Windows机器上传入(再次,文档似乎没有提到如何让它选择要绑定的端口),这似乎使它'选择任何可用的端口',这就是我想要的,但也许它在Solaris上发生了不同的行为(发生此问题的地方)?
我试图通过Unix套接字实现一个简单的echo客户端/服务器.(我的最终目标是交换JSON数据,但这个例子是为了简单起见).我不知道为什么客户端进程第二次尝试打印到套接字时会消失在黑洞中.
server.pl:
use IO::Socket::UNIX;
my $socket_path = '/tmp/mysocket';
unlink $socket_path if -e $socket_path;
my $socket = IO::Socket::UNIX->new(
Local => $socket_path,
Type => SOCK_STREAM,
Listen => SOMAXCONN,
);
die "Can't create socket: $!" unless $socket;
while (1) {
next unless my $connection = $socket->accept;
chomp( my $line = <$connection> );
print $connection "$line\n";
}
Run Code Online (Sandbox Code Playgroud)
client.pl:
use IO::Socket::UNIX;
my $socket = IO::Socket::UNIX->new(
Type => SOCK_STREAM,
Peer => '/tmp/mysocket',
);
die "Can't create socket: $!" unless $socket;
my $line;
print $socket "one\n";
chomp( …
Run Code Online (Sandbox Code Playgroud)