使用winsock spi在WSPSend函数中修改http请求头时遇到问题,怎样给lpBuffers重新赋值?

沉没捕鱼 发布于 2012/07/04 16:04
阅读 1K+
收藏 0

大家好,我想通过lsp修改http请求头里的某些内容,在WSPSend里这样操作:

int modifyFunc(const char *httpHeaderStr,int headerSize,char *&newHeader);
int WSPAPI MyWSPSend(
	SOCKET			s,
	LPWSABUF		lpBuffers,
	DWORD			dwBufferCount,
	LPDWORD			lpNumberOfBytesSent,
	DWORD			dwFlags,
	LPWSAOVERLAPPED	lpOverlapped,
	LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
	LPWSATHREADID	lpThreadId,
	LPINT			lpErrno
)
{
  //一些操作
  ...
  char *newBuf=NULL;
  int newSize=modifyFunc(lpBuffers[0].buf,lpBuffers[0].len,newBuf);//modifyFunc会给newBuf分配空间,填充新内容,并返回newBuf的长度
  char* oldBuf=lpBuffers[0].buf;
  lpBuffers[0].buf=newHeader;
  lpBuffers[0].len=newsize;
  delete[] oldBuf;
  int iRet= g_NextProcTable.lpWSPSend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
  return iRet;
}

由于是第一次写c++代码,听说c/c++一不小心就会造成内存泄漏,所以写起来是小心翼翼,甚至有点风声鹤唳。为了以防万一,我使用了vld.h(http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio)来检测内存泄漏。

这段代码,按我想的意思,既然给lpBuffers[0].buf赋新值了,那原来的应该释放掉。而lpBuffers的内容应该由系统来负责释放,因为在接下来的lsp链上都会用到它,我并不能预测什么时候可以释放。

结果一运行,报错,如下:

查看msdn上的WSPSend函数,有这一段“For a Winsock application, once the WSPSend function is called, the system owns these buffers and the application may not access them. This array must remain valid for the duration of the send operation.”,oldBuf应该是被系统锁定,无法delete。删掉delete[] oldBuf这一句,果然能运行起来了。但是我不知道系统会不会自动释放oldBuf,如果不能,应该怎样释放?

运行起来后,能达到目的,http header确实被修改了,但是使用Dbgview一查看,vld提示内存泄漏,提示是newHeader没有释放。我郁闷了,这个不应该由系统释放吗?我试着在g_NextProcTable.lpWSPSend前后释放都会导致http页面无法打开,我实在是不知道应该怎么释放了 ? 请教大家。

加载中
返回顶部
顶部