来自fileno和服务器实例的唯一数字连接ID

时间:2014-03-02 07:20:16

标签: perl sockets websocket publish-subscribe

我正在处理一些WebSocket / PubSub代码。

我正在生成一个简单的唯一活动客户端ID,如下所示:

my $connId =  $server_id . '-' . fileno($sock);

正常工作,因为fileno($ sock)每个服务器始终是唯一的,添加$ server_id使其在所有服务器中都是唯一的。

然而,对于下一个分支,如果我可以使我的$ connId只是一个整数将是方便的。 因此,寻找一些不错的XOR或其他快速逻辑来防止碰撞而不需要 - 。

UUID会有点矫枉过正,因为我只需要关注活动连接。

2 个答案:

答案 0 :(得分:1)

my $min_server_id = 1;
my $max_server_id = 12;

my $connId = fileno($sock) * ( $max_server_id - $min_server_id + 1) + ( $server_id - $min_server_id );


# later:
my $sock_fileno = int( $connId / ( $max_server_id - $min_server_id + 1 ) );
my $server_id = $connId % ( $max_server_id - $min_server_id + 1 ) + $min_server_id;

答案 1 :(得分:0)

ulimit -n告诉您可以拥有多少文件,这与fileno返回的文件描述符的最大数量一致。因此,请使用比此更大的乘数 - 我建议使用10的下一个幂 - 并将服务器编号乘以它,然后添加fileno