Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
c6bd0530
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c6bd0530
编写于
1月 28, 2014
作者:
B
bors
浏览文件
操作
浏览文件
下载
差异文件
auto merge of #11845 : xales/rust/libnative, r=alexcrichton
Fixes std::net test error when re-running too quickly. Suggested by @cmr
上级
b3d10f43
e901c4ca
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
55 addition
and
0 deletion
+55
-0
src/libnative/io/net.rs
src/libnative/io/net.rs
+11
-0
src/libstd/io/net/tcp.rs
src/libstd/io/net/tcp.rs
+40
-0
src/libstd/libc.rs
src/libstd/libc.rs
+4
-0
未找到文件。
src/libnative/io/net.rs
浏览文件 @
c6bd0530
...
...
@@ -348,6 +348,17 @@ pub fn bind(addr: ip::SocketAddr) -> IoResult<TcpListener> {
let
(
addr
,
len
)
=
addr_to_sockaddr
(
addr
);
let
addrp
=
&
addr
as
*
libc
::
sockaddr_storage
;
let
ret
=
TcpListener
{
fd
:
fd
};
// On platforms with Berkeley-derived sockets, this allows
// to quickly rebind a socket, without needing to wait for
// the OS to clean up the previous one.
if
cfg!
(
unix
)
{
match
setsockopt
(
fd
,
libc
::
SOL_SOCKET
,
libc
::
SO_REUSEADDR
,
1
as
libc
::
c_int
)
{
Err
(
n
)
=>
{
return
Err
(
n
);
},
Ok
(
..
)
=>
{
}
}
}
match
libc
::
bind
(
fd
,
addrp
as
*
libc
::
sockaddr
,
len
as
libc
::
socklen_t
)
{
-
1
=>
Err
(
super
::
last_error
()),
...
...
src/libstd/io/net/tcp.rs
浏览文件 @
c6bd0530
...
...
@@ -609,4 +609,44 @@ pub fn peer_name(addr: SocketAddr) {
c
.write
([
1
]);
p
.recv
();
})
iotest!
(
fn
double_bind
()
{
let
mut
called
=
false
;
io_error
::
cond
.trap
(|
e
|
{
assert!
(
e
.kind
==
ConnectionRefused
||
e
.kind
==
OtherIoError
);
called
=
true
;
})
.inside
(||
{
let
addr
=
next_test_ip4
();
let
listener
=
TcpListener
::
bind
(
addr
)
.unwrap
()
.listen
();
assert!
(
listener
.is_some
());
let
listener2
=
TcpListener
::
bind
(
addr
)
.and_then
(|
l
|
l
.listen
());
assert!
(
listener2
.is_none
());
});
assert!
(
called
);
})
iotest!
(
fn
fast_rebind
()
{
let
addr
=
next_test_ip4
();
let
(
port
,
chan
)
=
Chan
::
new
();
do
spawn
{
port
.recv
();
let
stream
=
TcpStream
::
connect
(
addr
);
// Close
port
.recv
();
}
{
let
mut
acceptor
=
TcpListener
::
bind
(
addr
)
.listen
();
chan
.send
(());
{
let
stream
=
acceptor
.accept
();
// Close client
chan
.send
(());
}
// Close listener
}
let
listener
=
TcpListener
::
bind
(
addr
);
})
}
src/libstd/libc.rs
浏览文件 @
c6bd0530
...
...
@@ -1547,6 +1547,7 @@ pub mod bsd44 {
pub
static
SOL_SOCKET
:
c_int
=
0xffff
;
pub
static
SO_KEEPALIVE
:
c_int
=
8
;
pub
static
SO_BROADCAST
:
c_int
=
32
;
pub
static
SO_REUSEADDR
:
c_int
=
4
;
}
pub
mod
extra
{
use
libc
::
types
::
os
::
arch
::
c95
::
c_int
;
...
...
@@ -2266,6 +2267,7 @@ pub mod bsd44 {
pub
static
SOL_SOCKET
:
c_int
=
1
;
pub
static
SO_KEEPALIVE
:
c_int
=
9
;
pub
static
SO_BROADCAST
:
c_int
=
6
;
pub
static
SO_REUSEADDR
:
c_int
=
2
;
}
#[cfg(target_arch
=
"x86"
)]
#[cfg(target_arch
=
"x86_64"
)]
...
...
@@ -2707,6 +2709,7 @@ pub mod bsd44 {
pub
static
SOL_SOCKET
:
c_int
=
0xffff
;
pub
static
SO_KEEPALIVE
:
c_int
=
0x0008
;
pub
static
SO_BROADCAST
:
c_int
=
0x0020
;
pub
static
SO_REUSEADDR
:
c_int
=
0x0004
;
}
pub
mod
extra
{
use
libc
::
types
::
os
::
arch
::
c95
::
c_int
;
...
...
@@ -3083,6 +3086,7 @@ pub mod bsd44 {
pub
static
SOL_SOCKET
:
c_int
=
0xffff
;
pub
static
SO_KEEPALIVE
:
c_int
=
0x0008
;
pub
static
SO_BROADCAST
:
c_int
=
0x0020
;
pub
static
SO_REUSEADDR
:
c_int
=
0x0004
;
}
pub
mod
extra
{
use
libc
::
types
::
os
::
arch
::
c95
::
c_int
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录