我正在构建一个必须发送请求和读取响应的tcp客户端,但也必须能够检测来自tcp服务器的不是对请求的响应的传入数据 - 服务器可以发起tx/rx序列.
什么是始终保持异步读取活动的最佳方法.我尝试了以下方法:
在我的"handle_connect"方法中,我启动了异步读取和异步写入.异步读取如下所示:
size_t bytes_transferred = BUFFER_SIZE;
boost::asio::async_read(m_socket,
boost::asio::buffer(rcvbuf, bytes_transferred),
boost::bind(&CClientSock::handle_read,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
异步写入填充缓冲区然后开始写入:
boost::asio::async_write(m_socket,
boost::asio::buffer(sndbuf, request_length),
boost::bind(&CClientSock::handle_write,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
在异步写入处理程序中 - 由于异步读取已经启动,因此它什么都不做.
这不起作用.应该从服务器对客户端写入的响应中读取的数据永远不会触发异步读取处理程序.我实际上并不确定写入会执行......
可以这样做,因为读取和写入不按正常顺序排队吗?我是否必须开始读取,然后取消它,如果我需要开始写入?
我正在尝试通过COM接口检索结构数组.当结构数为1时,它起作用.当结构数大于1时,只有第一个结构被正确地编组.数组中的其余结构具有垃圾数据.我的界面如下所示:
typedef struct tagINTOBJINTERFACE
{
long lObjectId;
IMyObject* pObj;
} INTOBJINTERFACE;
[
object,
uuid(<removed>),
dual,
nonextensible,
helpstring("Interface"),
pointer_default(unique)
]
interface IMyInterface : IUnknown {
HRESULT CreateObjects(
[in] VARIANT* pvDataStream,
[out]long* Count,
[out,size_is(,*Count)] INTOBJINTERFACE** ppStruct
);
};
Run Code Online (Sandbox Code Playgroud)
我像这样分配结构内存:
long lCountInterfaces = listInterfaces.GetCount();
long lMemSize = lCountInterfaces * sizeof(INTOBJINTERFACE);
INTOBJINTERFACE* pstruct = (INTOBJINTERFACE*) CoTaskMemAlloc( lMemSize );
Run Code Online (Sandbox Code Playgroud)
然后填写数组中每个结构的成员.我可以在调试器中看到所有数组元素的所有成员都已正确分配.在填充结构后,我指定"*ppStruct = pstruct"来传递数组.我还可以看到out参数"*Count"已正确设置为正确的元素数.
为什么这不起作用?