小编Ale*_*ner的帖子

SO_REUSEADDR和SO_REUSEPORT的行为发生了变化?

在旧版本的Mac OS X中,通配符绑定的工作方式如下所述:

套接字选项SO_REUSEADDR和SO_REUSEPORT,它们有何不同?它们在所有主要操作系统中的含义是否相同?

组播地址

SO_REUSEADDR的含义会更改多播地址,因为它允许多个套接字绑定到源多播地址和端口的完全相同的组合.换句话说,对于多播地址,SO_REUSEADDR的行为与单播地址的SO_REUSEPORT完全相同.实际上,代码对于多播地址同样对待SO_REUSEADDR和SO_REUSEPORT,这意味着您可以说SO_REUSEADDR对所有多播地址都意味着SO_REUSEPORT,反之亦然.

MacOS X.

在其核心,MacOS X只是一个BSD风格的UNIX,基于BSD代码的相当晚的分支,甚至与Mac OS 10.3版本的FreeBSD 5同步.这就是为什么MacOS X提供与BSD相同的选项,它们的行为方式与BSD相同.

但在10.10.5中,我在测试网络库时发现了一个变化.

即使设置了SO_REUSEADDR,两个未绑定(通配符)UDP套接字也不能再共享同一个端口(errno = EADDRINUSE).必须在两者上设置SO_REUSEPORT,这对我来说是一个谜.

它可以通过这个简单的测试代码重现:

#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

int main() {
    for(int p = 0; p < 4; ++p) {
        printf("Flags set: ");
        if(p&1) printf("SO_REUSEADDR ");
        if(p&2) printf("SO_REUSEPORT");
        printf("\n");

        int handles[2];
        bool success = true;
        for(int i = 0; i < sizeof(handles)/sizeof(int); ++i) {
            handles[i] = socket(AF_INET, SOCK_DGRAM, 0);

            int flag = 1;
            if((p&1) …
Run Code Online (Sandbox Code Playgroud)

sockets macos

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

在结构的定义中使用静态整数

我正在尝试将一些C++代码迁移到Rust.我尝试了很多不同的方法,但没有一个编译.

我想要一个可以处理不同类型的通用模板,并且具有可调整的总大小和静态字段(const表达式)Capacity:

template<class KeyType, class ValueType, int PageSize>
struct BplusTreeLeaf {
    static const uint16_t Capacity = (PageSize-16)/(sizeof(KeyType)+sizeof(ValueType));
    KeyType keys[Capacity];
    ValueType values[Capacity];
};
Run Code Online (Sandbox Code Playgroud)

我想从外面访问容量:

for(int i = 0; i < BplusTreeLeaf<x, y, 4096>::Capacity; i ++) { ... }
Run Code Online (Sandbox Code Playgroud)

似乎在Rust中没有办法做这样的事情,或者至少在我对Rust的理解中:

  • static 在结构中是不允许的,文档告诉我使用宏
  • 只有类型可以在Rust中"模板化",而不是值或表达式.我甚至无法将总大小作为参数传递给结构定义

这是我得到的:

macro_rules! BplusTreeLeaf {
    ($KeyType:ident, $ValueType:ident, $PageSize:expr) => {
        static Capacity_: u16 = ($PageSize - 16) / (std::mem::size_of::<$KeyType>() + std::mem::size_of::<$ValueType>());
        struct BplusTreeLeaf_ {
            keys: [$KeyType, ..Capacity_],
            values: [$ValueType, ..Capacity_],
        }
    }
}

BplusTreeLeaf!(u64, u64, 4096)
Run Code Online (Sandbox Code Playgroud)

编译器产生"向量长度的预期常量expr",这是不正确的,因为我没有使用"mut" Capacity_ …

generics rust

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

2 关于 Risc-V-Privileged-Spec-v1.7 的问题

  1. 第 16 页,表 3.1:mcpuid 中的基本字段:RV32I RV32E RV64I RV128I

    • 什么是“RV32E”?
    • 有“E”扩展名吗?
  2. ECALL(第 30 页)没有说明 PC 的行为。虽然 mepc(第 28 页)和 mbadaddr(第 29 页)声称“mepc 将指向指令的开头”。我认为 ECALL 应该将 mepc 设置为导致指令的末尾,以便 ERET 转到下一条指令。那正确吗?

riscv

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

标签 统计

generics ×1

macos ×1

riscv ×1

rust ×1

sockets ×1