CRLF 导致来自套接字的 read() 返回

Posted

技术标签:

【中文标题】CRLF 导致来自套接字的 read() 返回【英文标题】:CRLF causes read() from socket to return 【发布时间】:2021-06-22 05:09:08 【问题描述】:

我正在用 C++ 编写一个 HTTP 服务器,使用 TCP 套接字在客户端和服务器之间进行通信。

在使用我的 Linux 终端向服务器发送请求时,我注意到每次按 Enter,我的服务器上的 read() 都会返回(它会读取到 \r\n 并返回)。

这种行为“正常”吗?我没有发现它在任何地方提到过。

编辑:我使用 telnet 作为客户端和阻塞读取/接收

【问题讨论】:

【参考方案1】:

只要数据可用,就会返回阻塞的readrecv。如果您在在终端上作为客户端使用的任何东西(即 netcat、telnet 或类似)上输入Enter,它很可能(取决于实际的客户端)直接将此\r\n 发送到所在的服务器这将导致read/recv立即成功返回。

【讨论】:

所以Enter 发送一个信号,表明某些数据可用?编辑:我正在使用 telnet,并且我注意到使用阻塞或非阻塞套接字的这种行为。 Enter 导致 telnet 发送数据。该数据到达服务器会导致 read() 返回。 我们可以认为“正常”的 HTTP 客户端会有这种行为吗?或者我的服务器是否应该为一个完全一次性(而不是逐行)到达的请求做好准备? @Grim 你应该准备好接受一次到达一个字节的请求。 @Grim:您的服务器不应该对数据的读取方式做出任何假设。请求标头和正文可以在单个或单独的数据包中,甚至一半的请求可能在一个数据包中,其余的标头和正文在另一个数据包中。 TCP 只是一个字节流,而不是一个消息协议。特别是 - 一侧的 recv 不需要匹配另一侧的 send。所有重要的是最后的字节,无论它们是如何发送和接收的。

以上是关于CRLF 导致来自套接字的 read() 返回的主要内容,如果未能解决你的问题,请参考以下文章

TCP 套接字上的 read() 何时返回

套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?

使用 `read` 和 `epoll` 异步读取套接字

中止正在等待 Read() 语句的线程(C# 套接字编程)

close函数

如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE