百科.dev
全部条目AI 编程趋势榜开源项目技术资讯提交条目
登录
返回工具页/返回 Issues 列表
#2175·shadowsocks-rust

AEAD-2022 TCP 编写器在 Pending 后报告重试缓冲区长度,丢弃附加数据

作者: merrkry创建于 2026年9月13日更新于 2026年9月13日

use shadowsocks::{config::{ServerType}, context::{Context as SsContext}, crypto::{CipherKind}, relay::{tcprelay::{crypto_io::{CryptoStream, CryptoWrite, StreamType}, _}},}; use std::{io, pin::{Pin}, task::{Context, Poll, Waker},}; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};

#[derive(Default)] struct Sink { blocked: bool, bytes: Vec, waker: Option, }

impl AsyncRead for Sink { fn poll_read( self: Pin<&mut Self>, _: &mut Context<'_>, _: &mut ReadBuf<'_>, ) -> Poll<io::Result<()>> { Poll::Ready(Ok(())) } }

impl AsyncWrite for Sink { fn poll_write( mut self: Pin<&mut Self>, cx: &mut Context<'_>, data: &[u8], ) -> Poll<io::Result> { if self.blocked { self.waker = Some(cx.waker().clone()); return Poll::Pending; } self.bytes.extend_from_slice(data); Poll::Ready(Ok(data.len())) }

fn poll_flush(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<io::Result<()>> {
    if self.blocked {
        self.waker = Some(cx.waker().clone());
        return Poll::Pending;
    }
    self.bytes.extend_from_slice(data);
    Poll::Ready(Ok(()))
}

}

内容来源: shadowsocks/shadowsocks-rust

查看 GitHub 原文在 GitHub 查看讨论