gpt4 book ai didi

tcp - TCPStream如何知道消息何时完成?

转载 作者:行者123 更新时间:2023-12-03 11:28:32 29 4
gpt4 key购买 nike

以我的理解,TCPStream不知道何时从客户端收到完整的消息,但信息到达字节流。
但是,当我在Rust中执行标准的“Hello World” TCPStream示例时,我正在从流中读取完整的HTTP消息。当我发送两个或多个消息时,它们将相应地分开。
这怎么可能?

use std::io::prelude::*;
use std::net::TcpListener;
use std::net::TcpStream;

fn main() {
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();

for stream in listener.incoming() {
let stream = stream.unwrap();
handle_connection(stream);
}
}

fn handle_connection(mut stream: TcpStream) {
let mut buffer = [0; 512];
stream.read(&mut buffer).unwrap();
println!("{}", String::from_utf8_lossy(&buffer[..]));
}
当我减小缓冲区大小时,HTTP消息将被剪切,更新的消息将从头开始。我会以某种方式假设我必须自己管理结束和启动新的HTTP消息吗?

最佳答案

在非常低的级别上,客户端使用基本的Unix write(socket, buf, nbytes) 操作将字节放入套接字,而服务器使用nread = read(socket, buf, maxbytes) 将字节从套接字中拉出。
当将read()write()与套接字一起使用时,它们不保证有关将write()拆分为多个read()或将多个write()合并为一个大read()的任何行为。任何事情都可能发生,只要客户端最终写入的字节最终将由服务器以客户端写入它们的相同顺序读取(假设由于某种原因网络连接不会断开)。
在您的特定情况下,客户端可能发出了两个write()调用,这些调用在TCP层中转换为两个相应的数据包。服务器进程正在等待read()调用。服务器OS设法唤醒服务器进程,并在第二个数据包到达之前以其他方式通过服务器OS向其提供第一个数据包的内容。因此,服务器进程发现自己处于一个完全可以处理一个完整HTTP请求的便利位置。

关于tcp - TCPStream如何知道消息何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64103750/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com