sách gpt4 ai đã đi

c - putty 如何检测 xfer 是否正在备份?

In lại 作者:太空宇宙 更新时间:2023-11-03 23:29:19 hai mươi bốn 4
mua khóa gpt4 Nike

所以我想了解 PuTTY 如何实现 SCP 并有几个问题。

首先,这是一份较旧且(恕我直言)更易于阅读的 PuTTY SCP 实现版本:

https://github.com/Yasushi/putty/blob/4eeae4a39bc9faf539b8f819c12b1d1b9f22fc86/scp.c

这是发送数据的函数:

int scp_send_filedata(char *data, int len)
{
int bufsize = back->send(data, len);

/*
* If the network transfer is backing up - that is, the remote
* site is not accepting data as fast as we can produce it -
* then we must loop on network events until we have space in
* the buffer again.
*/
while (bufsize > MAX_SCP_BUFSIZE) {
if (!scp_process_network_event())
return 1;
bufsize = back->sendbuffer();
}

trả về 0;
}

这是 scp_process_network_event:

static int scp_process_network_event(void)
{
fd_set readfds;

FD_ZERO(&readfds);
FD_SET(scp_ssh_socket, &readfds);
if (select(1, &readfds, NULL, NULL, NULL) < 0)
return 0; /* doom */
select_result((WPARAM) scp_ssh_socket, (LPARAM) FD_READ);
return 1;
}

所以 scp_process_network_event 执行 select() 系统调用,阻塞直到写入操作不会阻塞?

我在想back->sendbuffer和back->send对应的是这个:

https://github.com/Yasushi/putty/blob/4eeae4a39bc9faf539b8f819c12b1d1b9f22fc86/ssh.c

/*
* Called to send data down the Telnet connection.
*/
static int ssh_send(char *buf, int len)
{
if (s == NULL || ssh_protocol == NULL)
trả về 0;

ssh_protocol(buf, len, 0);

return ssh_sendbuffer();
}

/*
* Called to query the current amount of buffered stdin data.
*/
static int ssh_sendbuffer(void)
{
int override_value;

if (s == NULL || ssh_protocol == NULL)
trả về 0;

/*
* If the SSH socket itself has backed up, add the total backup
* size on that to any individual buffer on the stdin channel.
*/
override_value = 0;
if (ssh_throttled_all)
override_value = ssh_overall_bufsize;

if (ssh_version == 1) {
return override_value;
} else if (ssh_version == 2) {
if (!mainchan || mainchan->closes > 0)
return override_value;
khác
return override_value + bufchain_size(&mainchan->v.v2.outbuffer);
}

trả về 0;
}

虽然我不太确定,但我也不太擅长 C :(

无论如何,我并不完全清楚 bufsize 应该是多少。

Bạn có ý tưởng nào không?

Cảm ơn!

1 Câu trả lời

选择在读取时阻塞。我们不能做任何事情(例如发送任何东西)所以我们必须等待一些东西出现才能读取 - 一旦我们读取了一些东西然后我们可以尝试再次发送我们排队的数据。

看起来 send() 将数据缓冲区放在内部缓冲区链表的末尾并尝试发送它,而 sendbuffer() 将刷新内部缓冲区链表中的任何剩余数据(例如,如果 send( ) 由于正在备份而无法全部发送)。

send()/sendbuffer() 方法看起来像是返回剩余要发送的数据量,例如有 5 个 10 字节的缓冲区要发送,您只能发送 2 个缓冲区,而内部缓冲区链表中仍有 30 个字节要发送,因此发送方法将返回 30。

重要的一点是,通过查看发送方法返回的值来检测拥塞 - 如果它们返回非零值,则意味着一些数据保留在内部发送缓冲区中并且尚未发送出去大概是为了拥堵。

ssh 后端 (ssh.c) 与普通的老式 telnet 后端共享一个 API,因此我们可以从 telnet.c 和 wininet.c 源中派生 API,而无需担心加密层。在 wininet.c:711我们实际上看到了在套接字上最终调用 send() 的位置,如果发送成功,我们调用 buffchain_consume() 以从缓冲区链表(例如 FIFO 队列)的开头取出这么多字节。整个函数有一个外部 while 循环,该循环一直持续到缓冲区链为空(或者除非我们在中间出现错误而返回)。

正是在这种方法中,我们从 libc(以及 php)中的 send() 中知道的“字节已成功发送”范例被转换为您的 putty 代码中使用的“排队等待发送的字节”范例示例。

基本上你有 N 字节的数据要发送,你成功发送()X 字节所以你还有 N-X 字节要发送。

实际减法发生在 buffchain_consume():127 中缓冲区内容的链接列表由该文件中的 buffchain_*() 方法管理。

关于c - putty 如何检测 xfer 是否正在备份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529353/

hai mươi bốn 4 0
Bài viết được đề xuất: c - 在条件宏中定义变量会出错
Bài viết được đề xuất: node.js - 在gulp-nodemon中设置端口有什么用?
Bài viết được đề xuất: node.js - 带有 Azure Functions App 和 NodeJS 的 Microsoft Bot Framework
Bài viết được đề xuất: node.js - 模式数组中的 Mongoose 计数
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com