- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我想了解 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/
Tôi có nút cộng/trừ và không muốn người dùng có thể chọn quá 20 nhưng không biết cách sử dụng nút này. Tôi đã thử sử dụng các thuộc tính min="1" max="5" nhưng chúng không hoạt động. Đây là mã của tôi và liên kết fiddle. https://jsf
Tôi đang cố gắng sao chép một biểu đồ trên cùng/dưới cùng như ví dụ ở đây nhưng nó không hiển thị chính xác (chuỗi màu tím có giá trị +ve và -ve, màu xanh lá cây là giá trị âm) và để lại các hiện tượng lộn xộn. Tôi cũng đang vật lộn để tạo ra một ví dụ đồ chơi để sao chép vấn đề này, vì vậy tôi hy vọng rằng mặc dù tôi thiếu dữ liệu, vẫn có một số
Đã đóng. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại không chấp nhận câu trả lời. Câu hỏi này có vẻ không liên quan đến lập trình trong phạm vi được xác định trong trung tâm trợ giúp. . Đã đóng cửa cách đây 6 năm. Cộng đồng đã xem xét năm ngoái
Câu hỏi này đã có câu trả lời ở đây: Cộng hai số nguyên dương sẽ cho kết quả âm. Tại sao? (4 câu trả lời) Đã đóng 5 năm trước. Tôi gặp phải một vấn đề lạ
Có ai biết cách chuyển đổi kiểu giá trị chuỗi -4,5 hoặc 5,4 thành double -4.5 hoặc 5.4 không? Câu trả lời tốt nhất là chỉ cần sử dụng Double.parseDouble(Locale, String); Ồ, tôi bị kẹt quá
Tôi đang cố gắng chèn một cột khung dữ liệu mới chỉ chứa các chuỗi 'tích cực' hoặc 'tiêu cực' dựa trên phân loại TextBlob: Đối với hàng đầu tiên của df của tôi, kết quả là ( pos , 0,75, 0,24999999999999997) Tôi muốn 'tích cực'
Tôi rất mới với VBA và không hiểu làm thế nào để thực hiện 2 tác vụ trong một vòng lặp. Tôi thực sự rất cảm kích sự giúp đỡ của bạn. Tôi đã có thể thay đổi các giá trị ở cột 2 dựa trên dữ liệu ở cột 3, nhưng tôi không hiểu cách đổi phông chữ của các giá trị âm thành màu đỏ. Kích thước của bảng là hàng tháng
Xin chào, tôi đang sử dụng jquery để gửi biểu mẫu qua POST. Đây là cách tôi nhận được giá trị. var mytext = $("#textareaid").val(); var dataStrin
double d = 0; // giá trị thập phân ngẫu nhiên với phần nguyên của nó nằm trong phạm vi Int32 và luôn luôn là p
Tôi có chuỗi này: var a='abc123#xyz123'; Tôi muốn xây dựng 2 hàm thay thế regex: 1) Thay thế tất cả các ký tự có '#' trong tương lai (trừ '#') bằng '*' Vì vậy, kết quả sẽ như thế này
Tôi đang sử dụng DialogFragment. Khi người dùng tương tác với văn bản chỉnh sửa trong hình ảnh ví dụ bên dưới từ màn hình ứng dụng Gmail trên máy tính bảng, tôi muốn các nút dương và âm vẫn nằm phía trên bàn phím. Trong nỗ lực của tôi, nó không hoạt động, đây là Dia của tôi
Từ cuốn sách Art of Assembly, tôi đã sao chép câu này: Trong hệ thống bổ sung của hai, bit HO của một số là bit dấu. Nếu HO
Có cách nào tốt hơn và thanh lịch hơn để triển khai mã đơn giản sau đây không (diffYear, A và B là các số): diffYear = yearA - yearB; if (diffYear == 0) { A = B
Tôi đang thiết kế một ngôn ngữ và đang cố gắng quyết định xem giá trị đúng nên là 0x01 hay 0xFF. Rõ ràng là tất cả các giá trị khác không sẽ được chuyển thành true, nhưng tôi đang cố gắng xác định biểu diễn bên trong chính xác. Ưu và nhược điểm của từng lựa chọn là gì? Câu trả lời tốt nhất không quan trọng, miễn là
Trong OnCreateDialog của lớp dialogfragment của tôi, tôi đang thực hiện điều này: AlertDialog.Builder builder = new AlertDialog.Builder
Câu hỏi này đã có câu trả lời ở đây: Giải quyết tình trạng quá tải mơ hồ trên con trỏ hàm và std::function cho lambda usein
Tôi đã tình cờ phát hiện ra một hành vi kỳ lạ của NSDecimalNumber: đối với một số giá trị nhất định, khi gọi integerValue, longValue, longLongValue, v.v., sẽ trả về các giá trị không mong muốn. Ví dụ:
Câu hỏi này đã có câu trả lời tại đây: Giải quyết tình trạng quá tải mơ hồ trên con trỏ hàm và std::function cho lambda bằng cách sử dụng
Tôi có biểu thức chính quy này để kiểm tra xem dữ liệu đầu vào của người dùng có hợp lệ hay không: value.length === 0 || value === '-' || (!isNaN(parseFloat(value)) && /^-?\d+\.
Tôi muốn áp dụng mô hình hỗn hợp Gaussian vào một tập dữ liệu, tập dữ liệu này chứa khoảng 120 nghìn mẫu, mỗi mẫu có khoảng 130 chiều. Khi tôi thực hiện việc này bằng matlab, tôi chạy tập lệnh (số cụm là 1000): gm = fitgmdist(d
Tôi là một lập trình viên xuất sắc, rất giỏi!