高分!!!如何获取Overlapped的WSASend的发送速度
例如写一个在两台机器间传送大量数据的程序,采用CompletionROUTINE的Overlapped模型,我的程序片断如下:
void CALLBACK OnSend(
DWORD dwError,
DWORD cbTransferred,
LPWSAOVERLAPPED lpOverlapped,
DWORD dwFlags)
{
TRACE("OnSend dwError %d, cbTransferred %d\n", dwError, cbTransferred);
memset(&stOverlapped, '\0', sizeof(stOverlapped));
if(SOCKET_ERROR == WSASend(s, &stSndBuf, 1, &dwSndBytes, 0, &stOverlapped, OnSend))
{
if(WSA_IO_PENDING != WSAGetLastError())
{
TRACE("WSASend() failed with error %d\n", WSAGetLastError());
return;
}
}
}
unsigned __stdcall OverLapThreadFunc( void* pArguments )
{
.
.
.
.
stSndBuf.buf = sSndBuf;
stSndBuf.len = 4096;
if(SOCKET_ERROR == WSASend(s, &stSndBuf, 1, &dwSndBytes, 0, &stOverlapped, OnSend))
{
if(WSA_IO_PENDING != WSAGetLastError())
{
TRACE("WSASend() failed with error %d\n", WSAGetLastError());
return 0;
}
while(1)
{
SleepEx(10000, TRUE);
}
.
.
.
}
首先做一次发送4096字节的操作,等到OnSend被回调时,再发送4096,就这样一直循环下去,可是我发现每次WSASend之后,OnSend马上被回调,这样我就无法得知实际发送了多少数据。
很多软件如CuteFTP在上传文件时是能够显示发送速度的。
难道只有用单线程同步socket才能获得发送速度吗?但是那样管理很多套接口时就会开很多线程,比较耗费资源,哪位高人能解决此问题?