关于winsock SPI WSPRecv函数截包重载问题,并关于VC初学者的一些困惑

abcbit 2003-03-31 04:41:27
刚学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++编程思想》(同时学习,可以吧?)
给点建议吧~ 小弟谢了!
...全文
153 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
PM 2003-04-02
  • 打赏
  • 举报
回复
IT老板们赶快去http://www.yiyuyan.com/看看吧,那里有一样东西会使你们兴奋不已,有了它,你可以大量裁减那些高学历、高工资的程序员,转而雇佣更便宜的中学生来为你打工了。心动不如行动喔。:-)
abcbit 2003-04-02
  • 打赏
  • 举报
回复
呵呵,谢谢了~~
还好,信心还在,感觉也不是太糟糕。
最近找了本《WINDOWS网络编程技术》里面有SPI方面的东西。

UP有分~~
xzsheng 2003-03-31
  • 打赏
  • 举报
回复
1. WSPRecv是接收报文的,没有转发。
2. SPI是很简单的替换方式。如果没有你写的WSPRecv,recv这个API就调用系统的。你写了以后,就是recv来调你,你再去调系统的,中间再加上自己的处理。
3. 你加的第一个注释是要在overlap模式下才会进入,很少程序会用这个模式。
4. 你加的第二个注释是接收出错时才进入,如果没有错误自然也就没有Log

最后,SPI是Windows socket里比较复杂的技术,实在不建议VC的初学者用它开头,可能会比较打击自信

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧