小编Ark*_*nez的帖子

为什么我的正则表达式匹配版本号不起作用?

我正在使用perl正则表达式匹配我所拥有的网络脚本的问题,我已经设法将行为放在一个小片段中.

在Debian中将这个Perl片段用于Perl 5.10.0:

#!/usr/bin/perl
use warnings;
use strict;

my $line = "Version: 0\r\n";
my($version) = $line =~ m/^Version:(\s\d+)\r\n$/;
print "1st failed \n" if not $version; 
($version) = $line =~ m/^Version:\s(\d+)\r\n$/;
print "2nd failed \n" if not $version; 
($version) = $line =~ m/^Version:\ (\d+)\r\n$/;
print "3th failed \n" if not $version; 
Run Code Online (Sandbox Code Playgroud)

有了这个输出:

2nd failed
3th failed 
Run Code Online (Sandbox Code Playgroud)

显然,第一和第二之间的唯一区别是将空间移出提取的模式,理论上不应该修改正则表达式,只返回返回的部分.

我不明白为什么第二和第三不完全像第一个一样.

编辑:如果你删除$ version中的括号不是相同的脚本,你得不到匹配的结果,你得到op的布尔结果,以获得你需要在一元中接收它的匹配结果(只有一个)字符串匹配)元组.

regex perl

3
推荐指数
1
解决办法
308
查看次数

消息队列用什么更好?互斥体和条件还是互斥体和信号量?

我正在实现一个基于 std::queue 的 C++ 消息队列。

由于我需要 popers 等待空队列,因此我正在考虑使用 mutex 进行互斥,并使用 cond 来挂起空队列上的线程,就像 glib 对 gasyncqueue 所做的那样。

然而,在我看来,互斥体和信号量可以完成这项工作,我认为它包含一个整数,并且对于待处理的消息来说,这似乎是一个相当高的数字。

信号量的优点是,您不需要每次从等待返回时手动检查条件,因为您现在可以确定有人插入了某些内容(当有人插入了 2 个项目并且您是第二个到达的线程时)。

你会选哪一个?

编辑:更改了响应@Greg Rogers 的问题

c++ linux multithreading posix

3
推荐指数
1
解决办法
7395
查看次数

auto_ptr内容上的三元运算符无法正常工作

我将auto_ptr初始化为NULL,稍后在游戏中我需要知道它是否为NULL以返回它或新副本.

我试过这个

auto_ptr<RequestContext> ret = (mReqContext.get() != 0) ? mReqContext : new RequestContext();
Run Code Online (Sandbox Code Playgroud)

和其他几个类似的东西一样,但是g ++试图调用auto_ptrs不存在的运算符?(三元运算符)而不是使用RequestContext*进行三元比较.

即使我施展它也行不通.

任何提示?

编辑等于不平等

c++ stl auto-ptr

3
推荐指数
1
解决办法
475
查看次数

当我有IV,纯文本和加密文本时,获取AES CBC密钥

我正在寻找一种从这组信息中获取密钥的方法,我知道我们正在使用带有CBC的16字节块,并且我有第一个16字节明文和加密,以及使用过的IV.

目前我可以通过比较输出来测试一个键是否正确,但是出于显而易见的原因我不能强行使用16个字符键,阅读其他帖子我的理解是拥有我拥有的数据可能是获得密钥的.

任何提示?

encryption cryptography aes

3
推荐指数
1
解决办法
4745
查看次数

EPOLLET模式下的Epoll在从套接字读取之前返回2个EPOLLIN

epoll联机帮助页说,如果没有读取,则EPOLLET注册的fd(边缘触发)不应通知两次EPOLLIN.
所以在EPOLLIN之后你需要清空缓冲区,然后epoll_wait才能在新数据上返回一个新的EPOLLIN.

但是我遇到了这种方法的问题,因为我看到了未触及的fds的重复EPOLLIN事件.
这是strace输出,0x200是EPOLLRDHUP,在我的glibc头文件中尚未定义,但在内核中定义.

30285 epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLPRI|EPOLLERR|EPOLLHUP|EPOLLET|0x2000, {u32=9, u64=9}}) = 0
30285 epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 10, -1) = 1
30285 epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 10, -1) = 1
30285 epoll_wait(3,  <unfinished ...>
30349 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = 0
30306 recv(9, "7u\0\0\10\345\241\312\t\20\f\32\r\10\27\20\2\30\200\10 \31(C0\17\32\r\10\27\20\2\30"..., 20000, 0) = 20000
30349 epoll_ctl(3, EPOLL_CTL_DEL, 9, NULL) = -1 ENOENT (No such file or directory)
30305 recv(9, " \31(C0\17\32\r\10\27\20\2\30\200\10 \31(C0\17\32\r\10\27\20\2\30\200\10 \31("..., 20000, 0) = 10011
Run Code Online (Sandbox Code Playgroud)

因此,在添加fd编号9之后,我在收到文件描述符之前会收到2个连续的EPOLLIN事件,系统调用跟踪显示我在读取之前如何删除fd,但它应该只发生一次,每个事件一个.
所以要么我没有正确阅读该联机帮助页,要么现在正在这里工作.

linux networking epoll epollet

2
推荐指数
1
解决办法
4372
查看次数

Erlang二进制字符串默认情况下

我正在编写一个erlang模块,它必须处理一些字符串,而不是太多,但是,我做了一些tcp recv,然后对数据进行了一些解析.

在匹配数据和操作字符串时,我一直在使用二进制模块,binary:split(Data,<<":">>)并且基本上一直使用<<"StringLiteral">>它.

直到现在我没有遇到困难或缺少替代方法(使用列表),一切都很自然地出来,除了可能添加<< >>,但我想知道这种处理字符串的方式是否有缺点我是不知道.

任何提示?

string binary erlang

2
推荐指数
1
解决办法
1917
查看次数

Erlang,process_flag trap_exit从CLI中杀死了我的gen_server

我有这个与我合作的gen_server:

-module(user_info_provider).
-export([start_link/0, stop/0]).
-export([init/1, terminate/2, handle_info/2, handle_call/3, handle_cast/2,
 code_change/3]).
-export([request_user_info/2]).

-behaviour(gen_server).

start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

stop() ->
    gen_server:cast(?MODULE, stop).

request_user_info(From,UserId) ->
    gen_server:cast(?MODULE, {request_user_info, From, UserId}).
%% Callback Functions
init(_) ->
    process_flag(trap_exit, true),
    io:format("I am ~w ~n", [self()]),
    {ok, null}.
%% @doc terminate
terminate(Reason, _LoopData) ->
    io:format("Terminating by ~w~n",[Reason]),
    {ok, null}.
handle_cast({request_user_info,From,UserId}, LoopData) ->
    {noreply, LoopData};
handle_cast(stop, LoopData) ->
    {stop, normal, LoopData}.
handle_info(_Info, State) ->
    {ok, State}.
code_change(_OldVsn, State, _Extra) ->
    {ok, State}.
handle_call(_,_From,LoopData) ->
    {ok,ok,LoopData}.
Run Code Online (Sandbox Code Playgroud)

问题是,正如我接下来所展示的那样,如果我从cli中执行它就像 …

linux erlang command-line-interface gen-server

1
推荐指数
1
解决办法
933
查看次数

在Perl中,如何解压缩到几个变量?

我有一个包含以下内容的结构:

struct mystruct{
  int                id[10];
  char               text[40];
  unsigned short int len;
};
Run Code Online (Sandbox Code Playgroud)

而我正试图将它解压缩到一行,如下所示:

  my(@ids,$text,$length) = unpack("N10C40n",$buff) ;
Run Code Online (Sandbox Code Playgroud)

但是一切都是第一个数组(@ids),我已经尝试了模板" N10 C40 n"和" (N10)(C40)(n)"所以,要么这不能完成,要么我没有使用正确的模板字符串.

注意:我正在使用大端数据.

任何提示?

perl unpack

0
推荐指数
1
解决办法
5411
查看次数

当另一方写入和关闭时,在epoll控制的非阻塞套接字上丢失字节

我有一个目前订阅的非阻塞套接字:

 ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET;
Run Code Online (Sandbox Code Playgroud)

它收到一些EPOLLIN,我读到非阻塞直到EAGAIN,然后我收到HUP和RDHUP,有时候还有几个字节要读.

另一方面是:

send(socket,960_bytes_buffer)
close(socket);
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用msg_peek直接在epollin和关闭时间的事件循环中进行recv,并且添加接收数据它总是不会收到960,有时只有大约480字节.

在发送和关闭之间使套接字无阻塞或在客户端中进入休眠(1)工作正常.

它看起来更像是一个非阻塞套接字的问题而不是与epoll相关的问题.简单的"nc -l -p port"接收适当的字节数.

sockets linux epoll nonblocking

0
推荐指数
1
解决办法
1358
查看次数

使用add + shift进行pcm16到pcm14的转换

我正在研究一种声音转换算法,其中接收一组带符号的短路.
在算法的给定点,它将样本从16位转换为14位,并且它像这样:

int16_t sample = (old_sample + 2) >> 2;
Run Code Online (Sandbox Code Playgroud)

对我来说很清楚,因为我们想要摆脱至少2个重要位,所以需要移位,但+2那里呢?

c linux audio pcm

0
推荐指数
1
解决办法
167
查看次数