Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust unistd::read()始终返回0_Rust_Ipc_Unix Socket - Fatal编程技术网

Rust unistd::read()始终返回0

Rust unistd::read()始终返回0,rust,ipc,unix-socket,Rust,Ipc,Unix Socket,我想用unix域套接字实现一个服务器/客户端程序。节目 1.启动时,在抽象命名空间中创建套接字和unix地址 2.尝试将套接字绑定到地址,如果绑定失败并返回EADDRINUSE,它将创建一个客户端,否则,如果绑定成功,将创建一个服务器。服务器永远在后台运行。 3.建立UDS IPC 然而,在myserver函数中,的结果似乎总是返回0;因此根本无法检索任何消息 执行: A航站楼: $ cargo run Finished dev [unoptimized + debuginfo] tar

我想用unix域套接字实现一个服务器/客户端程序。节目 1.启动时,在抽象命名空间中创建套接字和unix地址 2.尝试将套接字绑定到地址,如果绑定失败并返回
EADDRINUSE
,它将创建一个客户端,否则,如果绑定成功,将创建一个服务器。服务器永远在后台运行。 3.建立UDS IPC

然而,在my
server
函数中,的结果似乎总是返回0;因此根本无法检索任何消息

执行: A航站楼:

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/testrs`
Primary instance detected, launching server.
Listening...
Ending connection
Ending connection
Ending connection
^C
终端B:(在run命令之后)

杂项:

//参考实现:http://osr507doc.sco.com/en/netguide/dusockT.code_samples.html
使用{
尼克斯::{
errno::errno::EADDRINUSE,
sys::socket::{
接受、绑定、连接、侦听、套接字、AddressFamily、SockAddr、SockFlag、SockType、,
UnixAddr,
},
unistd:{关闭,读取,写入},
错误::Sys,
},
std::{error::error,os::unix::io::RawFd},
};
宏规则!期望{
() => {
结果
};
//($t:ty)=>{
//结果
// }
}
静态SOCK_ADDR:&'static str=“com.localserver.myapp.SOCK”;
常量消息容量:usize=64;//无法创建静态大小数组
fn重任务(参数:&str){
println!(“收到的消息:{}”,arg);
std::thread::sleep(std::time::Duration::from_secs(5));
}
服务器:

fn服务器(sock:RawFd)->预期!() {
听(短袜,0)?;
println!(“倾听…”);
环路{
匹配接受(袜子){
正常(msgsock)=>循环{
//让mut buf=[0u8;消息容量];
让mut buf=String::with_capacity(消息_capacity);
不安全{
设rval=read(msgsock,buf.as_bytes_mut())?;
如果rval==0{
println!(“终端连接”);
打破
}否则{
println!(“收到消息,模拟繁重的任务。”);
//TODO忽略所有传入消息
繁重的任务(&buf);
//TODO重新启用接受新邮件
}
}
关闭(msgsock)?;
},
//这里是EBADF
错误(e)=>{
关(袜子)?;
恐慌!(“接受套接字{:?}时出错,e)
}
}
}
//Ok(())//无法访问
}
客户:

fn客户端(sock:RawFd,addr:&SockAddr)->应为!() {
匹配连接(sock,addr){
好(41;)=>{
让mut buf=String::from(“来自客户端的消息”);
不安全{
写入(sock,buf.as_bytes_mut())?;
}
关(袜子)?;
好(())
}
错误(e)=>{
关(袜子)?;
死机!(“连接到套接字时出错:{}”,e);
}
}
}
主要内容:

fn main()->应为!() {
let sock:RawFd=socket(
AddressFamily::Unix,
SockType::Stream,
SockFlag::empty(),
无,//协议
)?;
让addr=SockAddr::Unix(UnixAddr::new_abstract(SOCK_addr.as_bytes())?);
//绑定前取消链接
//然而,抽象域套接字(我们正在使用)是自动生成的
//由内核清理,因此无需取消链接
匹配绑定(sock和addr){
错误(e)=>匹配e{
系统(EADDRINUSE)=>{
println!(“检测到辅助实例,正在启动客户端。”);
匹配客户端(sock和addr){
Ok()=>println!(“消息已发送”),
Err()=>println!(“消息发送失败”),
}
println!(“退出…”);
}
_ => {
恐慌!(“套接字绑定失败,原因是:{:?}”,e);
}
},
好(41;)=>{
println!(“检测到主实例,正在启动服务器。”);
服务器(sock)?;
}
}
好(())
}
我已尝试不关闭服务器中的连接:

如果rval==0{
//println!(“终端连接”);
//中断;
} 
在这种情况下,服务器无法说出
EBADF

如何从客户端读取这些消息?

At似乎由于字符串的工作方式,发送
buf
将无法工作。要解决此问题,您需要将
&mut[u8]
传递给read函数:

Ok(msgsock)=>循环{
//让mut buf=[0u8;消息容量];
让mut buf=[0u8;消息容量];
设rval=read(msgsock和mut buf[…])?;
如果rval==0{
println!(“终端连接”);
打破
}否则{
println!(“收到消息,模拟繁重的任务。”);
//TODO忽略所有传入消息
繁重的任务(std::str::来自utf8(&buf);
//TODO重新启用接受新邮件
}
}
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/testrs`
Secondary instance detected, launching client.
Message sent.
Exiting...
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/testrs`
Secondary instance detected, launching client.
Message sent.
Exiting...
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/testrs`
Secondary instance detected, launching client.
Message sent.
Exiting...