我可以在 IOCP WSARecv 函数中使用 std::string 吗?

Posted

技术标签:

【中文标题】我可以在 IOCP WSARecv 函数中使用 std::string 吗?【英文标题】:Can I use std::string in IOCP WSARecv func? 【发布时间】:2019-04-05 19:27:55 【问题描述】:

我尝试在 WSARecv (winsock) 中使用 std::string,但它不起作用,你能告诉我它是否可能以及它是如何工作的

【问题讨论】:

WSARecv 需要一个数组,std::string 不是数组。 @michael:不完全正确。当然 std::string 可以是数组... @MarcoFreudenberger 在 C++11 之前,std::string 的内部字符数据并没有保证存储在连续的内存中,尽管大多数常见的实现都是这样做的。 @Remy: afaik ALL 实现是这样做的,否则如果没有额外的复制操作,您将无法使用 c_str() 获得有效的 c 字符串指针。好一点,但标准并没有严格保证。 【参考方案1】:

您可以初始化传递给 WSARecv 的 WSABUF 结构,以便每个 WSA buf 中的 *buf 指针指向准备好的字符串 opbject 的缓冲区,类似于以下内容:

std::string myStringBuffer;
myStringBuffer.resize(1024);
WSABuf wsaBuffer;
wsaBuffer.len = 1024;
wsaBuffer.buf = &myStringBuffer[0];

【讨论】:

buf = myStringBuffer.data() 在 C++17 及更高版本中。我会使用len = myStringBuffer.size() 而不是硬编码len,以防您以后想更改myStringBuffer 的大小,或使其动态化。 @Remy:正确,尽管len = myStringBuffer.size() 可能需要一个 static_cast 以避免编译器警告,这就是我没有提到它的原因。

以上是关于我可以在 IOCP WSARecv 函数中使用 std::string 吗?的主要内容,如果未能解决你的问题,请参考以下文章

当目前没有 wsarecv 时,传入数据会发生啥

io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend

WSASend() 和 WSARecv() 的所有错误代码是不是意味着套接字已断开连接?

IOCP 接收和发送

readv()、writev()、WSARecv()、WSASend()

WSARecv() 函数使用解析