【发布时间】:2022-01-15 15:00:51
【问题描述】:
我正在使用与服务器的#include <sys/socket.h>库套接字连接,并使用char类型的vector从套接字连接接收数据,如下所示:
struct sockaddr_in serv_addr;
int sock, valread;
sock = 0;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// Convert IPv4 and IPv6 addresses from text to binary form
if (inet_pton(AF_INET, "0.0.0.0", &serv_addr.sin_addr) <= 0)
{
printf("\nInvalid address/ Address not supported \n");
}
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\nConnection Failed \n");
}
std::vector<char> buffer = {0};
buffer.reserve(1024);
read(sock, buffer.data(), 1024);
由于服务器响应大小的长度可变但不超过1024,所以为什么buffer的大小固定为1024。
现在因为我收到可变大小的响应,所以我想知道buffer 的大小。
我尝试了以下操作:
std::cout<<sizeof(buffer)<<" "<<buffer.size();
输出是
sizeof(buffer) = 32
buffer.size() = 1
如果我尝试1024 值,它会产生一些垃圾值,如下所示:
for (int i = 0; i < 1024; i++)
{
std::cout<<buffer[i];
}
输出:
[{“xmin”:95,“ymin”:147,“ymax”:276,“xmax”:193},{“xmin”:42,“ymin”:353,“ymax”:488,“ xmax”:123},{“xmin”:85,“ymin”:19,“ymax”:166,“xmax”:145},{“xmin”:1,“ymin”:254,“ymax”:327 ,“xmax”:107},{“xmin”:393,“ymin”:281,“ymax”:419,“xmax”:463},{“xmin”:379,“ymin”:316,“ymax” : 457, "xmax": 442}]���������!�)��0�8��?�G��N�V��]�e��l�t��{ ���������������������������������������������
那么有什么方法可以得到准确的响应大小?
【问题讨论】:
-
使用
read的返回值。您的程序应该始终检查每个函数调用的返回值,因为这是 C 语言中用来指示错误情况的习惯用法。 -
buffer.reserve(1024);这只是保留而不是设置向量大小。 -
@Dai 不太好 :) 这是那个图书馆的习语。在 C++ 中也有例外。所以更笼统地说,阅读任何库的文档,不要跳过它们总是很重要的细节。
-
@PepijnKramer
read是 POSIX 中的 C 函数,而不是 C++ 函数。检查函数返回值的习惯用法是an ecosystem-wide C idiom,而不仅仅是任何特定库之一。 -
好的,我现在知道了。问题标记为 C++。那么应该是“C”