gpt4 book ai didi

c++ - 为什么 std::string 使 WSAGetLastError 返回零?

转载 作者:太空宇宙 更新时间:2023-11-04 15:59:08 27 4
gpt4 key购买 nike

总有一天。我为 C++ (Visual Studio 2015) 编写了类似于 Python 内置套接字库的套接字包装器类

所有功能都运行良好。但是,我发现我写的一些函数有问题。

使用后std::string的方法类似于 .size() , .clear() , WSAGetLastError()总是返回零。

std::string str = "Hello, world";
size_t recvsz = ::send(socket, str.c_str(), str.size(), 0);

// Why always return zero after using std::string's methods?
int err = ::WSAGetLastError();

因此,我不知道套接字状态,套接字死了,或者套接字仍在等待接收数据。

因此,我使用了一种存储 WSAGetLastError() 的方法在 std::string 之前返回值的方法,然后使用 WSASetLastError() 恢复它.

std::string str = "Hello, world";

// Before using std::string's methods
int err = ::WSAGetLastError();

size_t recvsz = ::send(socket, str.c_str(), str.size(), 0);

// Restore error value after std::string's methods
::WSASetLastError(err);

我使用的方法正确吗?或者为什么 std::string使最后一个错误返回零?

已编辑:哇...我弄错了.. :(。我使用::send 而不是::recv。抱歉让您感到困惑

SOCKET socket;
char buf[100] = {0x00,};
std::string data, temp_buf;
ssize_t recvsz = ::recv(socket, buf, 99, 0);

// When err has proper error code before std::string methods
// It just for a test
// int err = ::WSAGetLastError();

temp_buf = buf;
data += buf;

int err = WSAGetLastError(); // Always return zero!

最佳答案

因为您在不属于您的只读存储器中写入内容,犯下了严重的轻率行为。简而言之,您破坏了计算机的内存,现在您的程序将无法正常运行。

使用兼容的 C++11 编译器,您可以:

ssize_t recvsz = ::recv(socket, &str[0], str.size(), 0);

那是因为 &str[0] 是指向实际字符串缓冲区的指针(在非 const 上下文中),并且因为从 C++11 开始数据是保证被存储连续地。从技术上讲,在此之前并没有那么多(尽管在实践中基本上总是如此)。

否则,您将不得不自己分配一个小的 char[] 缓冲区来接收数据。您几乎可以免费为它提供自动存储持续时间,除非您使用的嵌入式系统具有严格的资源限制(但无论如何您都不会使用 string)。

顺便说一句,请注意您的返回类型:size_t 是无符号的。 recv 返回一个 ssize_t,它已签名并且可能为负数以指示错误情况。

const size_t BUF_SIZE = 256;
char buf[BUF_SIZE];

ssize_t recvsz = ::recv(socket, &buf[0], BUF_SIZE, 0);
if (recvsz < 0) {
// ... handling
}

// Now, optionally:
std::string str(buf, recvsz);

现在,所有这些都已修复,答案是 the "last error" is permitted to be changed even by a successful operation .所以,是的,如果你想保留它,你必须保存然后重新设置以前的“最后一个错误”值。这似乎确实具有可疑的值(value)——为什么不在产生错误的地方处理它?在发生错误后继续进行似乎是一种糟糕的经商方式。

关于c++ - 为什么 std::string 使 WSAGetLastError 返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749733/

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