关于winsock SPI WSPRecv函数截包重载问题,并关于VC初学者的一些困惑
刚学VC,最近看包截取的程序(其实就是那个XFILTER.DLL),遇到不少疑惑。
比如重载是如何工作的,是不是先用自定义的WSPRecv()把地址索引存到自己定义的数组,然后调用原来系统提供的WSPRecv()转发数据,等CompletionRoutine确定接受数据成功后,再调用自己这个WSPRecv()确定已经重载过了(检查那个自定义的地址索引数组)后,再输出接受到数据信息(addr, numberofbytesrevcd).
这是我理解的重载,自定义的WSPRecv()要调用2次。但我用DGVIEW查看DEBUG信息,却有些不符合,不晓得为什么。具体看我的注释。
int WSPAPI WSPRecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno
)
{
ODS(_T("WSPRecv ..."));
BOOL IsSetCompletionRoutine = FALSE;
if(lpOverlapped && lpCompletionRoutine && m_Overlapped.AddOverlapped(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine, NULL, NULL, 0/*WSPRecv*/))
{
OutputDebugString(" ==>WSPRecv WSA_IO_PENDING\n");
//这个DEBUG信息一次也没在DGVIEW信息中出现,WHY?
lpCompletionRoutine = CompletionRoutine;
IsSetCompletionRoutine = TRUE;
}
int iRet = NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount
, lpNumberOfBytesRecvd, lpFlags, lpOverlapped
, lpCompletionRoutine, lpThreadId, lpErrno);
PrintReturnCode(iRet, lpErrno);
OutputDebugString("0.START...\n");
if(iRet == SOCKET_ERROR || IsSetCompletionRoutine == TRUE)
{
OutputDebugString("1.NO...\n");
//我认为 没个包都得经过这个过程,但在DGVIEW中有些没有,?
PrintSocket(s, 0, "0");
return iRet;
}
PrintSocket(s, *lpNumberOfBytesRecvd, "WSPRecv");
OutputDebugString("2.YES...\n");
//有点数据包没有出现"1.NO"就直接出现这个了, ?
return iRet;
}
VC包含太多了,特别是函数多的要死,怎么记得呀?数据类型也多~
自己非计算机科班,程序基础不怎么样,在学VC还在看《C++编程思想》(同时学习,可以吧?)
给点建议吧~ 小弟谢了!