c - 如何从C中的recv()读取提取参数和有效负载?

标签 c sockets unix-socket

我正在用 C 语言运行一个简单的客户端代码来对服务器进行 POST 和 GET 并读取数据流。目前,我正在打印在 recv() 中收到的完整响应,并且必须对其进行解析以供进一步使用。在读取数据流之前,我想知道来自服务器的HTTP状态代码(200、400、401等)是什么。我在标题中得到同样的结果。有没有办法在读取 headers 之前获取 HTTP 代码?

读取头参数和有效负载的最佳实践是什么?我搜索过,但得到的答案是读取“\r\n”序列并应用逻辑。还有更好的办法吗?

我正在使用 Ubuntu 系统来测试此代码。以下是正在打印的响应:

<p style="color:blue;">HTTP/1.1 401 Unauthorized  
Server: Apache-Coyote/1.1  
Content-Type: application/json  
Content-Length: 69  
Date: Mon, 08 Aug 2016 09:46:46 GMT  
</p>
<p style="color:blue;">"You are not a authorized user to access this resource. Access denied."

最佳答案

没有。 recv() 从套接字接收原始数据,我想在这种情况下是 TCP/IP。 TCP/IP 是一个较低层的协议(protocol),没有 HTTP 状态码的概念,HTTP 数据只是字节,没有任何意义。

因此,您确实必须读取数据,将其解释为 HTTP 协议(protocol)数据,然后从中获取状态代码。

<小时/>

您应该将 TCP/IP 和 HTTP 协议(protocol)的关注点分开。如果您想学习,您可以自己编写一个简单的 HTTP 客户端库;如果您需要生产质量代码,则可以找到一个现有的库(libcurl)。然后使用该库来处理 HTTP 协议(protocol)处理,并对应用程序代码隐藏较低级别的 TCP/IP 流量。

关于c - 如何从C中的recv()读取提取参数和有效负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828412/

相关文章:

c - Eclipse CDT——如何将 Linux 路径映射到 Windows 路径?

c - 如何在 C 中将 48 位字节数组转换为 64 位整数?

php - PHP 中的连接被拒绝错误

linux - SO_PEERCRED 与 SCM_CREDENTIALS - 为什么两者都有?

ios - 如何在iOS中设置UNIX域套接字?

linux - 如何在 Linux 上查看和编辑临时端口范围?

c - 将 FILE* 结构映射到缓冲区?

sockets - 为什么连接读取返回缓冲区的长度,而不是真正发送?

c - 写入关闭的本地 TCP 套接字不会失败

c - 使用指针实现 strcat