【问题标题】:Can I use std::string in IOCP WSARecv func?我可以在 IOCP WSARecv 函数中使用 std::string 吗?
【发布时间】: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 字符串指针。好一点,但标准并没有严格保证。

标签: c++ winsock2 iocp


【解决方案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 以避免编译器警告,这就是我没有提到它的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多