n.netService, err = nebnet.NewNebService(n)
if err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to setup net service.")
}
netservice有两个成员
type NebServicestruct {
node *Node
dispatcher *Dispatcher
}
跳出stup()函数
先进入start()函数看一看
if err := n.netService.Start()err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to start net service.")
}
进入netservice.start()
func (ns *NebService) Start() error {
logging.CLog().Info("Starting NebService...")
// start dispatcher.
ns.dispatcher.Start()
// start node.
if err := ns.node.Start()err != nil {
ns.dispatcher.Stop()
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Error("Failed to start NebService.")
return err
}
logging.CLog().Info("Started NebService.")
return nil
}
可以看到第一个start()的函数是dispatcher.start()
进入dispatch.start()
func (dp *Dispatcher) Start() {
logging.CLog().Info("Starting NebService Dispatcher...")
go dp.loop()
}
然后就出现一个新的线程、goruntime
go dp.loop()
进入该线程,看它干了些什么
timerChan := time.NewTicker(time.Second).C
for {
select {
case <-timerChan:
metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))
case <-dp.quitCh:
logging.CLog().Info("Stoped NebService Dispatcher.")
return
case msg := <-dp.receivedMessageCh:
msgType := msg.MessageType()
v, _ := dp.subscribersMap.Load(msgType)
if v == nil {
continue
}
m, _ := v.(*sync.Map)
m.Range(func(key, valueinterface{}) bool {
select {
case key.(*Subscriber).msgChan <- msg:
default:
logging.VLog().WithFields(logrus.Fields{
"msgType": msgType,
}).Warn("timeout to dispatch message.")
}
return true
})
}
}
一个有点长的循环
metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))一秒钟刷新一次缓冲区
case msg := <-dp.receivedMessageCh:
msgType := msg.MessageType()如果能取出dp.receivedMessageCh
msgType := msg.MessageType()首先判断取出的信息类型
v, _ := dp.subscribersMap.Load(msgType)
if v == nil {
continue
}
根据类型取出相应的map
如果取不出,那么使用continue结束这个case
m, _ := v.(*sync.Map)
断言
m.Range(func(key, valueinterface{}) bool {
select {
case key.(*Subscriber).msgChan <- msg:
default:
logging.VLog().WithFields(logrus.Fields{
"msgType": msgType,
}).Warn("timeout to dispa+tch message.")
}
return true
})
将msg推入其他管道里面去。其他goruntime会循环等待该
在学习教程请请确定你已正确安装了p2p终结者41.第一次启动p2p终结者,会提示我们选择网卡。这个主要是针对电脑上有多个网卡的,如果有多个网卡,请选择你连接局域网的那个网卡。只有一个网卡的不用我教了吧,因为你没得选择。而常规设置、控制设置、界面设置这些功能是对p2p终结者软件本身进行设置的,一般来说无需设置。2.选择好网卡之后,我们点击p2p终结者界面上的“扫描”按钮,扫描局域内的电脑情况。p2p终结者会自动将扫描出来的结果显示控制机代表本机,192.168.203.1这个IP地址就是其它用户的电脑IP3.到这步要注意了,我们点击p2p终结者左侧的“系统设置”然后点击“时间计划设置”。
打开“时间计划设置”后,新建一个时间计划,我们使用鼠标拖动选择一下所有时间段,当然如果你有特殊要求可以选择对应的时间段。时间计划建立好后,我们再点击p2p终结者左侧系统设置菜单里的“控制规则设置”,同样新建一个规则,不过这个规则就比较麻烦了,相关的设置参数请参考下一页的截图说明。以上就是“控制规则设置”的向导截图,完成之后,就可以对目标机进行控制了。4.选择需要进行控制的主机(就是IP列表显示的),然后点击鼠标右键选择“为选中主机指定规则”。5.指定规则后,我们同上面操作一样,也是打开鼠标右键菜单,这时选择“控制选中主机”就启用了p2p终结者来对目标主机进行控制了。而控制的条件就是我们自己设置的规则。点评:个人觉得4.0版本更为专业,使用了规则之类,但是对新手来说,可能操作更为复杂。我还是想重复一下文章开头所说的那句话,现在p2p终结者不是啥神秘的软件,很多网络都有对付p2p终结者的方法,如果你使用p2p终结者发现没有效果,这就很正常的。
1.安装,打开,点击软件配置选项,在网卡选项下拉菜单里选择网卡(就一个可选),之后点击下面的保存配置。 2.点击网络控制台,启动。 3.点击网络主机扫描,把需要控制的主机勾选,右键最下一条设置流量,再点应用控制设置。 4.点击网络应用管理,需要的勾选,看你的实际情况。..