c - SO_MARK有效值

标签 c linux sockets networking

SO_MARK 的有效且有意义的值是什么?我发现一些项目使用 int,一些 unsigned int ( dnsmasq ):

unsigned int mark;
if (get_incoming_mark(&forward->frec_src.source, &forward->frec_src.dest, 0, &mark))
     setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));

我认为使用 unsigned int 是正确的(因此 ping 的 PR 可能是正确的: https://github.com/iputils/iputils/pull/345 )。但是 ping 允许用户指定 SO_MARK,因此我还想添加对有效输入的检查。

另外,我可以在wireshark/tcpdump输出中看到SO_MARK设置吗?

最佳答案

内核用于套接字的struct sock结构defines the fieldSO_MARK设置为:__u32 sk_mark。所以我想说任何 uint32_t 对于此选项都是有意义的值。

Also, can I see SO_MARK setup in wireshark/tcpdump output?

据我所知不,mark实际上并未设置在数据包上(在任何层),它只是设置在用于管理套接字的内部内核结构上(struct sock )和数据包控制信息(struct sk_buff)。您不会“在线上”看到它。

但是,您可以使用 iptables 将标记的数据包记录到 dmesg,例如 this answer在 Unix 和 Linux SE 上建议:

$ sudo iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "

$ ./send-some-marked-packets ...

$ sudo dmesg
...
[27448.839237] IPTables-Marks: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=31 TOS=0x00 PREC=0x00 TTL=64 ID=45988 DF PROTO=UDP SPT=40656 DPT=12345 LEN=11 MARK=0xcc

关于c - SO_MARK有效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69890641/

相关文章:

c - 是否可以使用编译指示覆盖 C 中的枚举基类型?

c - 当我只有指向该结构的指针时,如何访问保存在结构中的字符串中的单个字符

c++ - 在 Linux 上使用 geany

java - android: TCP 连接性能

c - 服务器从客户端接收到一些垃圾值?

c - fork() 后没有得到预期的输出。为什么?

c - 如何在 C 中将字符串存储在多维数组中?

linux - Linux 上为 "Error Unclassifiable statement"

c - 父进程,创建 2 个子进程并使用管道发送数据

sockets - 如何防止接收套接字永远阻塞以防万一它没有接收到任何数据?