Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
0de77399
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0de77399
编写于
4月 25, 2016
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
find free ports: make it work, add timeout and tests
上级
9b1e364f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
73 addition
and
15 deletion
+73
-15
src/vs/base/node/ports.ts
src/vs/base/node/ports.ts
+47
-10
src/vs/base/test/node/port.test.ts
src/vs/base/test/node/port.test.ts
+25
-4
src/vs/workbench/services/thread/electron-browser/threadService.ts
...rkbench/services/thread/electron-browser/threadService.ts
+1
-1
未找到文件。
src/vs/base/node/ports.ts
浏览文件 @
0de77399
...
...
@@ -11,23 +11,60 @@ import net = require('net');
* Given a start point and a max number of retries, will find a port that
* is openable. Will return 0 in case no free port can be found.
*/
export
function
findFreePort
(
startPort
:
number
,
giveUpAfter
:
number
,
clb
:
(
port
:
number
)
=>
void
):
void
{
export
function
findFreePort
(
startPort
:
number
,
giveUpAfter
:
number
,
timeout
:
number
,
clb
:
(
port
:
number
)
=>
void
):
void
{
let
done
=
false
;
const
timeoutHandle
=
setTimeout
(()
=>
{
if
(
!
done
)
{
done
=
true
;
return
clb
(
0
);
}
},
timeout
);
doFindFreePort
(
startPort
,
giveUpAfter
,
(
port
)
=>
{
if
(
!
done
)
{
done
=
true
;
window
.
clearInterval
(
timeoutHandle
);
return
clb
(
port
);
}
});
}
function
doFindFreePort
(
startPort
:
number
,
giveUpAfter
:
number
,
clb
:
(
port
:
number
)
=>
void
):
void
{
if
(
giveUpAfter
===
0
)
{
return
clb
(
0
);
}
let
tryPort
=
startPort
;
const
client
=
new
net
.
Socket
()
;
let
server
=
net
.
createServer
();
server
.
listen
(
tryPort
,
(
err
)
=>
{
server
.
once
(
'
close
'
,
()
=>
{
return
clb
(
tryPort
);
});
// If we can connect to the port it means the port is already taken so we continue searching
client
.
once
(
'
connect
'
,
()
=>
{
dispose
(
client
);
server
.
close
(
);
return
doFindFreePort
(
startPort
+
1
,
giveUpAfter
-
1
,
clb
);
});
server
.
on
(
'
error
'
,
(
err
)
=>
{
findFreePort
(
startPort
+
1
,
giveUpAfter
-
1
,
clb
);
client
.
once
(
'
error
'
,
(
err
)
=>
{
dispose
(
client
);
// If we receive any non ECONNREFUSED error, it means the port is used but we cannot connect
if
(
err
.
code
!==
'
ECONNREFUSED
'
)
{
return
doFindFreePort
(
startPort
+
1
,
giveUpAfter
-
1
,
clb
);
}
// Otherwise it means the port is free to use!
return
clb
(
startPort
);
});
client
.
connect
(
startPort
);
}
function
dispose
(
socket
:
net
.
Socket
):
void
{
socket
.
removeAllListeners
(
'
connect
'
);
socket
.
removeAllListeners
(
'
error
'
);
socket
.
end
();
socket
.
destroy
();
socket
.
unref
();
}
\ No newline at end of file
src/vs/base/test/node/port.test.ts
浏览文件 @
0de77399
...
...
@@ -10,18 +10,18 @@ import * as net from 'net';
import
ports
=
require
(
'
vs/base/node/ports
'
);
suite
(
'
Ports
'
,
()
=>
{
test
(
'
Finds a free port
'
,
function
(
done
:
()
=>
void
)
{
test
(
'
Finds a free port
(no timeout)
'
,
function
(
done
:
()
=>
void
)
{
// get an initial freeport >= 7000
ports
.
findFreePort
(
7000
,
100
,
(
initialPort
)
=>
{
ports
.
findFreePort
(
7000
,
100
,
300000
,
(
initialPort
)
=>
{
assert
.
ok
(
initialPort
>=
7000
);
// create a server to block this port
const
server
=
net
.
createServer
();
server
.
listen
(
initialPort
,
null
,
null
,
()
=>
{
server
.
listen
(
initialPort
,
null
,
null
,
()
=>
{
// once listening, find another free port and assert that the port is different from the opened one
ports
.
findFreePort
(
7000
,
50
,
(
freePort
)
=>
{
ports
.
findFreePort
(
7000
,
50
,
300000
,
(
freePort
)
=>
{
assert
.
ok
(
freePort
>=
7000
&&
freePort
!==
initialPort
);
server
.
close
();
...
...
@@ -30,4 +30,25 @@ suite('Ports', () => {
});
});
});
test
(
'
Finds a free port (with timeout)
'
,
function
(
done
:
()
=>
void
)
{
// get an initial freeport >= 7000
ports
.
findFreePort
(
7000
,
100
,
300000
,
(
initialPort
)
=>
{
assert
.
ok
(
initialPort
>=
7000
);
// create a server to block this port
const
server
=
net
.
createServer
();
server
.
listen
(
initialPort
,
null
,
null
,
()
=>
{
// once listening, find another free port and assert that the port is different from the opened one
ports
.
findFreePort
(
7000
,
50
,
0
,
(
freePort
)
=>
{
assert
.
equal
(
freePort
,
0
);
server
.
close
();
done
();
});
});
});
});
});
\ No newline at end of file
src/vs/workbench/services/thread/electron-browser/threadService.ts
浏览文件 @
0de77399
...
...
@@ -275,7 +275,7 @@ class ExtensionHostProcessManager {
// Check for a free debugging port
if
(
typeof
config
.
env
.
debugExtensionHostPort
===
'
number
'
)
{
return
findFreePort
(
config
.
env
.
debugExtensionHostPort
,
10
/* try 10 ports */
,
(
port
)
=>
{
return
findFreePort
(
config
.
env
.
debugExtensionHostPort
,
10
/* try 10 ports */
,
5000
/* try up to 5 seconds */
,
(
port
)
=>
{
if
(
!
port
)
{
console
.
warn
(
'
%c[Extension Host] %cCould not find a free port for debugging
'
,
'
color: blue
'
,
'
color: black
'
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录