SPI截获邮件数据包产生重复数据的问题
小弟我正在用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
每个命令都重复了两次。不明白这是为什么,请高人回答,谢谢。