【发布时间】:2018-04-17 12:42:41
【问题描述】:
我们有一个 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"..\..\..\Export\Include" /I"..\Include" /I"..\..\Include" /I"..\..\..\Include" /I"..\..\..\Ref\Include" /ZI /Gm- /Od /sdl- /Fd"C:\Workspaces\grpMiddleware\gc_AsioCom_x64\AsioCommunication\Test\Vc150\Debug_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:\Workspaces\grpMiddleware\gc_AsioCom_x64\AsioCommunication\Test\Vc150\Debug_x64\\" /EHsc /nologo /Fo"C:\Workspaces\grpMiddleware\gc_AsioCom_x64\AsioCommunication\Test\Vc150\Debug_x64\\" /Fp"C:\Workspaces\grpMiddleware\gc_AsioCom_x64\AsioCommunication\Test\Vc150\Debug_x64\\Testd.pch" /diagnostics:classic
【问题讨论】:
-
除非您可以创建Minimal, Complete, and Verifiable Example 向我们展示,否则很难非常以有意义的方式帮助您(除了猜测 i>)。
标签: c++ boost boost-asio