Mac OS X - 为什么netstat会出错“得到%d两次”?

时间:2013-01-10 19:46:46

标签: c macos freebsd netstat darwin

我正在试图找出为什么我的Mac OS X计算机上的netstat会打印“两次获得4次”等内容。

例如:

$ netstat | head -15
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
[...]
tcp4       0      0  localhost.56892        localhost.26164        ESTABLISHED
got 4 twice
got 16 twice
got 1 twice
got 4 twice
got 4 twice
got 8 twice

邮件由netstat的inet.c打印,函数protopr基本上执行以下操作:

  • 使用例如sysctlbyname(3)拨打电话net.inet.tcp.pcblist_n xgn_kind获取PCB列表(我猜?)
  • 遍历结果,收集指向各种结构的指针,其类型称为xgn_kind
  • 它为它看到的每个"got %d twice"设置了一点。如果它看到任何两次,则会发出消息void protopr(uint32_t proto, /* for sysctl version we pass proto # */ char *name, int af) { /* ... */ if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) { if (errno != ENOENT) warn("sysctl: %s", mibvar); return; } /* ... */ for (next = buf + ROUNDUP64(xig->xig_len); next < buf + len; next += ROUNDUP64(xgn->xgn_len)) { /* ... */ if ((which & xgn->xgn_kind) == 0) { which |= xgn->xgn_kind; /* ... */ } else { printf("got %d twice\n", xgn->xgn_kind); } /* ... */ }

我已经删除了代码的相关部分:

sysctl

我的问题是,最后:

为什么会这样?这是从sysctl回来的错误数据吗?上面的循环是不正确的,即,{{1}}实际上可以返回几种结构吗?

请注意,我正在运行Mac OS X - 代码确实与FreeBSD's略有不同。

0 个答案:

没有答案