C++ Boost::asio x64 async_send失败,出现错误 10014 (WSAEFAULT)
C++ Boost::asio x64 async_send fails with error 10014 (WSAEFAULT)
我们有一个C++程序,我将在Visual Studio 2017中移植到x64。该程序使用boost asio通过TCP连接发送数据。代码在 32 位下工作正常。但是当我构建然后为 x64 运行它时,async_send失败并出现错误 10014 (WSAEFAULT(,我调试了 boost asio 代码,可以预见的罪魁祸首是对 windows 方法 WSASend 的调用(在 boost\asio\detail\impl\win_iocp_socket_service_base.ipp 中(:https://msdn.microsoft.com/en-us/library/windows/desktop/ms742203(v=vs.85(.aspx
这是我目前失败的相关代码(为了排除其他可能的原因而简化(。此时连接设置成功,我尝试通过连接发送第一个数据:
std::vector<unsigned char> testWriteBuffer(16,0);
boost::asio::async_write(m_Socket,
boost::asio::buffer(&testWriteBuffer[0], testWriteBuffer.size()),
boost::bind(&CTIPCTCPConnection::IOHandleWrite, boost::static_pointer_cast<CTIPCTCPConnection>(shared_from_this()), NextMessage->IsLowPriority(),boost::asio::placeholders::error));
m_Socket在哪里:
boost::asio::ip::tcp::socket m_Socket;
不确定这是否相关,这是编译器的命令行(我们使用相同的选项构建了 boost 库(:
/GS /W4 /Zc:wchar_t /I"......ExportInclude" /I"..Include" /I"....Include" /I"......Include" /I"......RefInclude" /ZI /Gm- /Od /sdl- /Fd"C:WorkspacesgrpMiddlewaregc_AsioCom_x64AsioCommunicationTestVc150Debug_x64\Test.pdb" /Zc:inline /fp:precise /Zp1 /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_WIN32_WINNT=0X603" /D "WINVER=0X603" /D "_MBCS" /D "_CRT_SECURE_NO_WARNINGS" /D "_TOKHEIM_FUELPOS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /Fa"C:WorkspacesgrpMiddlewaregc_AsioCom_x64AsioCommunicationTestVc150Debug_x64\" /EHsc /nologo /Fo"C:WorkspacesgrpMiddlewaregc_AsioCom_x64AsioCommunicationTestVc150Debug_x64\" /Fp"C:WorkspacesgrpMiddlewaregc_AsioCom_x64AsioCommunicationTestVc150Debug_x64\Testd.pch" /diagnostics:classic
从您发布的几行来看,似乎有点糟糕的是,std::vector<unsigned char> testWriteBuffer(16,0)
很可能存在于堆栈上,因此在您调用async_write
后被销毁,但它应该在完成例程运行之前处于活动状态。正如你在 boost::asio::buffer 的文档中看到的
应用程序负责确保内存区域保持有效,直到 I/O 操作不再需要它。
更新
嗯,是的,WSABUF 遭受/Zp1
,请参阅这个简单示例:
//#pragma pack(push, 1)
#include <Winsock2.h>
#include <cstdio>
int main(int argc, char** argv)
{
WSABUF buffer;
printf("size - %zu, offset of buf - %zu, offset of len - %zu", sizeof(buffer), offsetof(decltype(buffer), buf), offsetof(decltype(buffer), len));
return 0;
}
没有它给的包装 - size - 16, offset of buf - 8, offset of len - 0
,与 - size - 12, offset of buf - 4, offset of len - 0
在 x64 上。您不能隔离提升 I/O 部分并在没有/Zp1
的情况下编译升压吗?
显然,这样做的原因是/Zp1 编译标志(结构成员对齐(。一旦我从项目及其所有依赖项中删除了它,它再次工作正常。删除它确实打开了一个全新的蠕虫罐,向后兼容。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ Boost::asio x64 async_send失败,出现错误 10014 (WSAEFAULT)
- C++服务器,System.10014 错误,使用加速