我可以在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend
WSASend() 和 WSARecv() 的所有错误代码是不是意味着套接字已断开连接?