代码之家  ›  专栏  ›  技术社区  ›  metamemelord

将socket2与hyper一起使用

  •  0
  • metamemelord  · 技术社区  · 5 年前

    我正在编写一个http服务器,它通过unix域套接字与主机一起工作。服务器是使用hyper编写的,我正在通过socket2连接到UDS。

    这是我的代码:

    let socket = Socket::new(Domain::UNIX, Type::STREAM, None)?;
    let socket_address = SockAddr::unix("unix://tmp/test.sock")?;
    socket.bind(&socket_address)?;
    socket.listen(128)?;
    let server = hyper::server::Server::builder(socket.into()).serve(service);
    

    无法推断类型参数的类型 I

    error[E0698]: type inside `async fn` body must be known in this context
      --> src/server.rs:65:64
       |
    65 |     let server = hyper::server::Server::builder(socket.into()).serve(service);
       |                                                                ^^^^^ cannot infer type for type parameter `I`
       |
    note: the type is part of the `async fn` body because of this `await`
      --> src/server.rs:66:13
       |
    66 |     let _ = server.await?;
       |             ^^^^^^^^^^^^
    

    是的泛型参数 hyper::server::Server . 虽然我知道是什么导致了这个问题:编译器无法确定是什么导致了这个问题 socket.into() 去吧,我不知道怎么解决它。

    如果我的理解有误,请纠正。我能在这方面得到一些帮助吗?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Alice Ryhl    5 年前

    您需要将套接字转换为以下类型: tokio::net::UnixListener . 完成此操作后,需要实现 Accept 特质您可以通过以下方式实现该特性:

    use hyper::server::accept::Accept;
    use tokio::net::UnixListener;
    
    use std::pin::Pin;
    use std::task::{Context, Poll};
    
    pub struct UDSAccept {
        inner: UnixListener,
    }
    
    impl Accept for UDSAccept {
        type Conn = tokio::net::UnixStream;
        type Error = std::io::Error;
    
        fn poll_accept(
            self: Pin<&mut Self>,
            cx: &mut Context<'_>,
        ) -> Poll<Option<Result<Self::Conn, Self::Error>>> {
            match self.inner.poll_accept(cx) {
                Poll::Pending => Poll::Pending,
                Poll::Ready(Ok((socket, _addr))) => Poll::Ready(Some(Ok(socket))),
                Poll::Ready(Err(err)) => Poll::Ready(Some(Err(err))),
            }
        }
    }
    

    Server::builder .

    如果Tokio类型附带的构造函数没有提供您需要的所有选项,并且您仍然希望使用 socket2 要构造它,可以首先将其转换为std UnixListener 然后打电话给东京的 from_std 方法请注意,执行此操作时,您必须自己将套接字设置为非阻塞模式!

    推荐文章