Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitacc1905

Browse files
authored
Merge pull request#333 from nxtrace/main
SYNC
2 parentscb302df +612880c commitacc1905

File tree

3 files changed

+137
-45
lines changed

3 files changed

+137
-45
lines changed

‎trace/trace.go‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ var (
2424
errInvalidMethod=errors.New("invalid method")
2525
errNaturalDone=errors.New("trace natural done")
2626
errTracerouteExecuted=errors.New("traceroute already executed")
27-
lastErrerror
2827
geoCache= sync.Map{}
2928
ipGeoSF singleflight.Group
3029
rDNSSF singleflight.Group
@@ -326,6 +325,7 @@ func (h *Hop) fetchIPData(c Config) error {
326325
maxRetries=5
327326
}
328327

328+
varlastErrerror
329329
forattempt:=0;attempt<=maxRetries;attempt++ {
330330
// 超时:2s 起,每次 +1s,上限 6s
331331
timeout:=time.Duration(2+attempt)*time.Second
@@ -353,6 +353,9 @@ func (h *Hop) fetchIPData(c Config) error {
353353
returnnil
354354
}
355355
// 所有尝试均失败
356+
iflastErr==nil {
357+
lastErr=errors.New("ipgeo: lookup failed without specific error (DN42)")
358+
}
356359
returnlastErr
357360
}
358361
returnnil
@@ -388,6 +391,7 @@ func (h *Hop) fetchIPData(c Config) error {
388391
maxRetries=5
389392
}
390393

394+
varlastErrerror
391395
forattempt:=0;attempt<=maxRetries;attempt++ {
392396
// 超时:2s 起,每次 +1s,上限 6s
393397
timeout:=time.Duration(2+attempt)*time.Second
@@ -416,6 +420,9 @@ func (h *Hop) fetchIPData(c Config) error {
416420
return
417421
}
418422
// 所有尝试均失败
423+
iflastErr==nil {
424+
lastErr=errors.New("ipgeo: lookup failed without specific error")
425+
}
419426
ipGeoCh<-lastErr
420427
}()
421428

‎util/util.go‎

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import (
77
"log"
88
"net"
99
"net/url"
10-
"os"
1110
"runtime"
1211
"strings"
1312
"sync"
13+
"time"
1414

1515
"github.com/fatih/color"
1616

@@ -240,51 +240,73 @@ func DomainLookUp(host string, ipVersion string, dotServer string, disableOutput
240240
default:
241241
r=newUDPResolver()
242242
}
243-
ipsStr,err:=r.LookupHost(context.Background(),host)
244-
for_,v:=rangeipsStr {
245-
ips=append(ips,net.ParseIP(v))
246-
}
243+
ctx,cancel:=context.WithTimeout(context.Background(),5*time.Second)
244+
defercancel()
245+
ipsStr,err:=r.LookupHost(ctx,host)
247246
iferr!=nil {
248-
returnnil,errors.New("DNS lookup failed")
247+
returnnil,fmt.Errorf("DNS lookup failed: %w",err)
248+
}
249+
for_,v:=rangeipsStr {
250+
ifparsed:=net.ParseIP(v);parsed!=nil {
251+
ips=append(ips,parsed)
252+
}
249253
}
250254

251255
// Filter by IPv4/IPv6
252256
ifipVersion!="all" {
253257
varfilteredIPs []net.IP
254258
for_,ip:=rangeips {
259+
ifip==nil {
260+
continue
261+
}
255262
ifipVersion=="4"&&ip.To4()!=nil {
256263
filteredIPs= []net.IP{ip}
257264
break
258-
}elseifipVersion=="6"&&strings.Contains(ip.String(),":") {
265+
}elseifipVersion=="6"&&ip.To4()==nil {
259266
filteredIPs= []net.IP{ip}
260267
break
261268
}
262269
}
263270
ips=filteredIPs
264271
}
265272

273+
iflen(ips)==0 {
274+
varfamilyLabelstring
275+
switchipVersion {
276+
case"4":
277+
familyLabel="IPv4"
278+
case"6":
279+
familyLabel="IPv6"
280+
case"all","":
281+
familyLabel="IPv4/IPv6"
282+
default:
283+
familyLabel=ipVersion
284+
}
285+
returnnil,fmt.Errorf("no %s DNS records found for %s",familyLabel,host)
286+
}
287+
266288
if (len(ips)==1)|| (disableOutput) {
267289
returnips[0],nil
268-
}else {
269-
fmt.Println("Please Choose the IP You Want To TraceRoute")
270-
fori,ip:=rangeips {
271-
_,_=fmt.Fprintf(color.Output,"%s %s\n",
272-
color.New(color.FgHiYellow,color.Bold).Sprintf("%d.",i),
273-
color.New(color.FgWhite,color.Bold).Sprintf("%s",ip),
274-
)
275-
}
276-
varindexint
277-
fmt.Printf("Your Option: ")
278-
_,err:=fmt.Scanln(&index)
279-
iferr!=nil {
280-
index=0
281-
}
282-
ifindex>=len(ips)||index<0 {
283-
fmt.Println("Your Option is invalid")
284-
os.Exit(3)
285-
}
286-
returnips[index],nil
287290
}
291+
292+
fmt.Println("Please Choose the IP You Want To TraceRoute")
293+
fori,ip:=rangeips {
294+
_,_=fmt.Fprintf(color.Output,"%s %s\n",
295+
color.New(color.FgHiYellow,color.Bold).Sprintf("%d.",i),
296+
color.New(color.FgWhite,color.Bold).Sprintf("%s",ip),
297+
)
298+
}
299+
varindexint
300+
fmt.Printf("Your Option: ")
301+
_,err=fmt.Scanln(&index)
302+
iferr!=nil {
303+
index=0
304+
}
305+
ifindex>=len(ips)||index<0 {
306+
fmt.Println("Your Option is invalid")
307+
returnnil,fmt.Errorf("invalid selection: %d",index)
308+
}
309+
returnips[index],nil
288310
}
289311

290312
funcGetHostAndPort() (hoststring,portstring) {

‎wshandle/client.go‎

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,30 @@ type WsConn struct {
4040
stateMu sync.RWMutex
4141
}
4242

43+
func (c*WsConn)getConn()*websocket.Conn {
44+
c.stateMu.RLock()
45+
deferc.stateMu.RUnlock()
46+
returnc.Conn
47+
}
48+
49+
func (c*WsConn)setConn(conn*websocket.Conn) {
50+
c.stateMu.Lock()
51+
c.Conn=conn
52+
c.stateMu.Unlock()
53+
}
54+
55+
func (c*WsConn)getDoneChan()chanstruct{} {
56+
c.stateMu.RLock()
57+
deferc.stateMu.RUnlock()
58+
returnc.Done
59+
}
60+
61+
func (c*WsConn)setDoneChan(donechanstruct{}) {
62+
c.stateMu.Lock()
63+
c.Done=done
64+
c.stateMu.Unlock()
65+
}
66+
4367
varwsconn*WsConn
4468
varhost,port,fastIpstring
4569
varenvToken=util.EnvToken
@@ -93,7 +117,12 @@ func (c *WsConn) keepAlive() {
93117
for {
94118
<-time.After(time.Second*54)
95119
ifc.IsConnected() {
96-
err:=c.Conn.WriteMessage(websocket.TextMessage, []byte("ping"))
120+
conn:=c.getConn()
121+
ifconn==nil {
122+
c.setConnected(false)
123+
continue
124+
}
125+
err:=conn.WriteMessage(websocket.TextMessage, []byte("ping"))
97126
iferr!=nil {
98127
log.Println(err)
99128
c.setConnected(false)
@@ -112,16 +141,25 @@ func (c *WsConn) keepAlive() {
112141
}
113142

114143
func (c*WsConn)messageReceiveHandler() {
144+
done:=c.getDoneChan()
115145
deferfunc() {
146+
ifdone==nil {
147+
return
148+
}
116149
select {
117-
case<-c.Done:
150+
case<-done:
118151
default:
119-
close(c.Done)
152+
close(done)
120153
}
121154
}()
122155
for {
123156
ifc.IsConnected() {
124-
_,msg,err:=c.Conn.ReadMessage()
157+
conn:=c.getConn()
158+
ifconn==nil {
159+
c.setConnected(false)
160+
continue
161+
}
162+
_,msg,err:=conn.ReadMessage()
125163
iferr!=nil {
126164
// 读取信息出错,连接已经意外断开
127165
// log.Println(err)
@@ -131,31 +169,56 @@ func (c *WsConn) messageReceiveHandler() {
131169
ifstring(msg)!="pong" {
132170
c.MsgReceiveCh<-string(msg)
133171
}
172+
}else {
173+
// 降低断线时期的 CPU 占用
174+
time.Sleep(200*time.Millisecond)
134175
}
135176
}
136177
}
137178

138179
func (c*WsConn)messageSendHandler() {
180+
doneCh:=c.getDoneChan()
139181
for {
182+
ifcurrent:=c.getDoneChan();current!=nil&&current!=doneCh {
183+
doneCh=current
184+
}
140185
// 循环监听发送
141186
select {
142-
case<-c.Done:
143-
return
187+
case<-doneCh:
188+
for {
189+
newDone:=c.getDoneChan()
190+
ifnewDone!=nil&&newDone!=doneCh {
191+
doneCh=newDone
192+
break
193+
}
194+
time.Sleep(50*time.Millisecond)
195+
}
196+
continue
144197
caset:=<-c.MsgSendCh:
145198
// log.Println(t)
146199
if!c.IsConnected() {
147200
c.MsgReceiveCh<-`{"ip":"`+t+`", "asnumber":"API Server Error"}`
148-
}else {
149-
err:=c.Conn.WriteMessage(websocket.TextMessage, []byte(t))
150-
iferr!=nil {
151-
log.Println("write:",err)
152-
return
153-
}
201+
continue
202+
}
203+
conn:=c.getConn()
204+
ifconn==nil {
205+
c.MsgReceiveCh<-`{"ip":"`+t+`", "asnumber":"API Server Error"}`
206+
continue
207+
}
208+
iferr:=conn.WriteMessage(websocket.TextMessage, []byte(t));err!=nil {
209+
log.Println("write:",err)
210+
c.setConnected(false)
211+
c.MsgReceiveCh<-`{"ip":"`+t+`", "asnumber":"API Server Error"}`
212+
continue
154213
}
155214
// 来自终端的中断运行请求
156215
case<-c.Interrupt:
157216
// 向 websocket 发起关闭连接任务
158-
err:=c.Conn.WriteMessage(websocket.CloseMessage,websocket.FormatCloseMessage(websocket.CloseNormalClosure,""))
217+
conn:=c.getConn()
218+
ifconn==nil {
219+
return
220+
}
221+
err:=conn.WriteMessage(websocket.CloseMessage,websocket.FormatCloseMessage(websocket.CloseNormalClosure,""))
159222
iferr!=nil {
160223
ifutil.EnvDevMode {
161224
panic(err)
@@ -164,7 +227,7 @@ func (c *WsConn) messageSendHandler() {
164227
}
165228
select {
166229
// 等到了结果,直接退出
167-
case<-c.Done:
230+
case<-doneCh:
168231
// 如果等待 1s 还是拿不到结果,不再等待,超时退出
169232
case<-time.After(1*time.Second):
170233
}
@@ -225,7 +288,7 @@ func (c *WsConn) recreateWsConn() {
225288
dialer.Proxy=http.ProxyURL(proxyUrl)
226289
}
227290
ws,_,err:=dialer.Dial(u.String(),requestHeader)
228-
c.Conn=ws
291+
c.setConn(ws)
229292
iferr!=nil {
230293
log.Println("dial:",err)
231294
// <-time.After(time.Second * 1)
@@ -237,7 +300,7 @@ func (c *WsConn) recreateWsConn() {
237300
}
238301
c.setConnectionState(err==nil,false)
239302

240-
c.Done=make(chanstruct{})
303+
c.setDoneChan(make(chanstruct{}))
241304
goc.messageReceiveHandler()
242305
}
243306

@@ -314,14 +377,14 @@ func createWsConn() *WsConn {
314377
log.Println("dial:",err)
315378
// <-time.After(time.Second * 1)
316379
cacheTokenFailedTimes++
317-
wsconn.Done=make(chanstruct{})
380+
wsconn.setDoneChan(make(chanstruct{}))
318381
gowsconn.keepAlive()
319382
gowsconn.messageSendHandler()
320383
returnwsconn
321384
}
322385
// defer c.Close()
323386
// 将连接写入WsConn,方便随时可取
324-
wsconn.Done=make(chanstruct{})
387+
wsconn.setDoneChan(make(chanstruct{}))
325388
gowsconn.keepAlive()
326389
gowsconn.messageReceiveHandler()
327390
gowsconn.messageSendHandler()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp