Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Canread
Gopsutil
提交
855ec85d
G
Gopsutil
项目概览
Canread
/
Gopsutil
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gopsutil
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
855ec85d
编写于
5月 16, 2014
作者:
W
WAKAYAMA Shirou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement net_io_counters on Windows.
上级
d5a476f6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
93 addition
and
2 deletion
+93
-2
common.go
common.go
+24
-0
common_windows.go
common_windows.go
+11
-0
net_windows.go
net_windows.go
+58
-2
未找到文件。
common.go
浏览文件 @
855ec85d
...
...
@@ -9,6 +9,7 @@ package gopsutil
import
(
"bufio"
"os"
"reflect"
"strconv"
"strings"
)
...
...
@@ -77,3 +78,26 @@ func stringContains(target []string, src string) bool {
}
return
false
}
// get struct attributes.
// This method is used only for debugging platform dependent code.
func
attributes
(
m
interface
{})
map
[
string
]
reflect
.
Type
{
typ
:=
reflect
.
TypeOf
(
m
)
if
typ
.
Kind
()
==
reflect
.
Ptr
{
typ
=
typ
.
Elem
()
}
attrs
:=
make
(
map
[
string
]
reflect
.
Type
)
if
typ
.
Kind
()
!=
reflect
.
Struct
{
return
nil
}
for
i
:=
0
;
i
<
typ
.
NumField
();
i
++
{
p
:=
typ
.
Field
(
i
)
if
!
p
.
Anonymous
{
attrs
[
p
.
Name
]
=
p
.
Type
}
}
return
attrs
}
common_windows.go
浏览文件 @
855ec85d
...
...
@@ -4,6 +4,7 @@ package gopsutil
import
(
"syscall"
"unsafe"
)
var
(
...
...
@@ -18,3 +19,13 @@ type FILETIME struct {
DwLowDateTime
uint32
DwHighDateTime
uint32
}
// borrowed from net/interface_windows.go
func
bytePtrToString
(
p
*
uint8
)
string
{
a
:=
(
*
[
10000
]
uint8
)(
unsafe
.
Pointer
(
p
))
i
:=
0
for
a
[
i
]
!=
0
{
i
++
}
return
string
(
a
[
:
i
])
}
net_windows.go
浏览文件 @
855ec85d
...
...
@@ -3,9 +3,65 @@
package
gopsutil
import
(
"errors"
"net"
"os"
"syscall"
"unsafe"
)
func
NetIOCounters
(
pernic
bool
)
([]
NetIOCountersStat
,
error
)
{
return
nil
,
errors
.
New
(
"not implemented yet"
)
ifs
,
err
:=
net
.
Interfaces
()
if
err
!=
nil
{
return
nil
,
err
}
ai
,
err
:=
getAdapterList
()
if
err
!=
nil
{
return
nil
,
err
}
var
ret
[]
NetIOCountersStat
for
_
,
ifi
:=
range
ifs
{
name
:=
ifi
.
Name
for
;
ai
!=
nil
;
ai
=
ai
.
Next
{
name
=
bytePtrToString
(
&
ai
.
Description
[
0
])
c
:=
NetIOCountersStat
{
Name
:
name
,
}
row
:=
syscall
.
MibIfRow
{
Index
:
ai
.
Index
}
e
:=
syscall
.
GetIfEntry
(
&
row
)
if
e
!=
nil
{
return
nil
,
os
.
NewSyscallError
(
"GetIfEntry"
,
e
)
}
c
.
BytesSent
=
uint64
(
row
.
OutOctets
)
c
.
BytesRecv
=
uint64
(
row
.
InOctets
)
c
.
PacketsSent
=
uint64
(
row
.
OutUcastPkts
)
c
.
PacketsRecv
=
uint64
(
row
.
InUcastPkts
)
c
.
Errin
=
uint64
(
row
.
InErrors
)
c
.
Errout
=
uint64
(
row
.
OutErrors
)
c
.
Dropin
=
uint64
(
row
.
InDiscards
)
c
.
Dropout
=
uint64
(
row
.
OutDiscards
)
ret
=
append
(
ret
,
c
)
}
}
return
ret
,
nil
}
// borrowed from src/pkg/net/interface_windows.go
func
getAdapterList
()
(
*
syscall
.
IpAdapterInfo
,
error
)
{
b
:=
make
([]
byte
,
1000
)
l
:=
uint32
(
len
(
b
))
a
:=
(
*
syscall
.
IpAdapterInfo
)(
unsafe
.
Pointer
(
&
b
[
0
]))
err
:=
syscall
.
GetAdaptersInfo
(
a
,
&
l
)
if
err
==
syscall
.
ERROR_BUFFER_OVERFLOW
{
b
=
make
([]
byte
,
l
)
a
=
(
*
syscall
.
IpAdapterInfo
)(
unsafe
.
Pointer
(
&
b
[
0
]))
err
=
syscall
.
GetAdaptersInfo
(
a
,
&
l
)
}
if
err
!=
nil
{
return
nil
,
os
.
NewSyscallError
(
"GetAdaptersInfo"
,
err
)
}
return
a
,
nil
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录