SPI截获邮件数据包产生重复数据的问题

liuintermilan 2009-03-29 08:43:03
小弟我正在用SPI开发一个截获POP3 110端口数据的DLL供上层程序调用。
我基本按照编写spi程序的老套路,分为安装程序和功能DLL。
安装程序就是构造个分层协议和协议链,将分层协议放在协议链的顶端。在将这个协议链放在LSP的顶端。
功能DLL部分主要改了两个函数,代码如下:
int WSPAPI WSPConnect(SOCKET s, const struct sockaddr* name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData,LPQOS lpSQOS,
LPQOS lpGQOS, LPINT lpErrno)
{
//当有110端口数据时用gl_fileMail打开文件1.txt,并保存此时的socket至gl_sockRecvMail
struct sockaddr_in sin;
sin = *(const struct sockaddr_in *)name;
if (sin.sin_port == htons(110))
{
gl_isPop3Open = TRUE;
gl_sockRecvMail = s;
gl_fileMail.open("c:\\1.txt", ios::out | ios::app);
if (!gl_fileMail)
{
exit(0);
}
}
return gl_NextProcTable.lpWSPConnect(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, lpErrno);
}

int WINAPI WSPSend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPWSATHREADID lpThreadId,LPINT lpErrno)
{
if (gl_isPop3Open && (s == gl_sockRecvMail))
{
for (int i = 0; i < dwBufferCount; i++)
{

gl_fileMail << lpBuffers[i].buf;
gl_fileMail.flush();
}
gl_fileMail << gl_i;//gl_i初始值为0
gl_i ++;
}
return gl_NextProcTable.lpWSPSend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
}
代码的意思比较浅显,主要是测试一下功能。我用foxmail收邮件后,1.txt中出现如下内容。
USER 364610680
USER 364610680
0PASS 123456
0PASS 123456
1STAT
1STAT
2UIDL
2UIDL
3LIST
3LIST
4QUIT
4QUIT
5
5
每个命令都重复了两次。不明白这是为什么,请高人回答,谢谢。
...全文
302 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuintermilan 2009-03-31
  • 打赏
  • 举报
回复
问题解决:
个人感觉当用邮件客户端接受邮件时,同时有两个进程打开了110端口(我猜想可能是防火墙)。
我用独占方式打开文件保存数据即可 。
oyljerry 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liuintermilan 的回复:]
如何增加log?我就是不太会调试这个东西……
[/Quote]
WSPSend 函数一进来,你就往一个文件如C:\\log.txt中写入你的一些信息...
liuintermilan 2009-03-30
  • 打赏
  • 举报
回复
如何增加log?我就是不太会调试这个东西……
liuintermilan 2009-03-30
  • 打赏
  • 举报
回复
如何增加log?我就是不太会调试这个东西……
oyljerry 2009-03-30
  • 打赏
  • 举报
回复
可以增加log查看 WSPSend是不是被调用多次了
liuintermilan 2009-03-30
  • 打赏
  • 举报
回复
即使在输出的时候只输出lpBuffers[0].buf结果也是一样的。
我也不知道lpBuffer[0].buf里的内容会不会重复。我不知道如何调试这样的程序。不过逻辑上说,我感觉这个dll可能被调用了两次
liuintermilan 2009-03-30
  • 打赏
  • 举报
回复
目前有个比较怪的事情,我在文件里不是插入了数字方便调试么,现在的结果是这样:
0USER 364610680
0USER 364610680
1PASS lyd
1PASS lyd
2STAT
2STAT
3UIDL
3UIDL
4LIST
4LIST
5QUIT
5QUIT
(这时关掉foxmail,再打开重新收邮件,注意角标变化,其中一行角标递增,一行回零)
0USER 364610680
6USER 364610680
1PASS lyd
7PASS lyd
2STAT
8STAT
3UIDL
9UIDL
4LIST
10LIST
5QUIT
11QUIT
(不关闭foxmail,重新收邮件,两行角标都递增)
6USER teenagerli
12USER teenagerli
7PASS 046021
13PASS 046021
8STAT
14STAT
9UIDL
15UIDL
10LIST
16LIST
11QUIT
17QUIT
我目前觉得是有两个进程……望高手指点下。
cnzdgs 2009-03-30
  • 打赏
  • 举报
回复
如果DLL用的是多线程运行库,那就应该不是这方面的问题了。你换种方式试试,用CreateFile、WriteFile等API来写文件。
liuintermilan 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cnzdgs 的回复:]
引用 2 楼 liuintermilan 的回复:
怎么在VC6下设置?我猜想是不是工程设置下的有个什么Use Runtime Library选项,我目前选择的是Debug Multithreaded

就是这个地方,Debug和Release版到单独设置。需要改的是DLL项目。
[/Quote]
是不是Install程序部分不用管,只改dLL的?我Dll部分目前用的是Debug Multithreaded。生成的DLL是debug版的,我目前一用就是上述效果。
能详细告诉我怎么改么?
blackcat242 2009-03-30
  • 打赏
  • 举报
回复
逻辑估计有问题,调试一下或者加日志看
cnzdgs 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liuintermilan 的回复:]
怎么在VC6下设置?我猜想是不是工程设置下的有个什么Use Runtime Library选项,我目前选择的是Debug Multithreaded
[/Quote]
就是这个地方,Debug和Release版到单独设置。需要改的是DLL项目。
oyljerry 2009-03-29
  • 打赏
  • 举报
回复
看 lpBuffers 中数据是不是重复了...
liuintermilan 2009-03-29
  • 打赏
  • 举报
回复
怎么在VC6下设置?我猜想是不是工程设置下的有个什么Use Runtime Library选项,我目前选择的是Debug Multithreaded
cnzdgs 2009-03-29
  • 打赏
  • 举报
回复
改一下项目设置中的编译选项,把运行库设置为多线程。

18,363

社区成员

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

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