关于SOCKET的RecvFrom,在Release下内存出错?

easyctrl 2013-02-22 07:39:35
在ONInitDialog中初始化:

WSADATA data;
WSAStartup(2,&data);

GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
struct ip_mreq ipmr;
int len=sizeof(ipmr);
//获取本机IP
//hostent* phost = gethostbyname("");
//char* localIP = inet_ntoa (*(struct in_addr *)*phost->h_addr_list);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//广播的话是,127.0.0.1
addr.sin_port = htons(5002);
ipmr.imr_multiaddr.s_addr=inet_addr("234.5.5.5");
ipmr.imr_interface.s_addr=htonl(INADDR_ANY);
//设置广播类型setsockopt(m_Socket,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(optval));
//创建套接字
m_Socket = socket(AF_INET,SOCK_DGRAM,0);
if (m_Socket == INVALID_SOCKET)
{
MessageBox("套接字创建失败!");
}
//绑定套接字
if (bind(m_Socket,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
{
MessageBox("套接字绑定失败!");
}
setsockopt(m_Socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&ipmr,len);
WSAAsyncSelect(m_Socket,m_hWnd,CM_RECEIVED,FD_READ);
------------------------------
然后在响应OnRead事件中如下:
BYTE *buffer= new BYTE[MAX_BUFF];
int factsize =sizeof(sockaddr);
int ret = recvfrom(m_Socket,(char*)buffer,MAX_BUFF,0,(sockaddr*)&m_Addr,&factsize);
if(ret==-1)
{
delete buffer;
buffer=NULL;
m_iRecvCount=1;
bRecing=FALSE;
return;
}
UDPPACKAGE *pack;
pack=(UDPPACKAGE*)buffer;
int iCount=pack->iIndex;
int iJpegSize=pack->JpegSize;
int iBufferSize=pack->buffersize;
bool bFinish=pack->bFinish;
if(m_iRecvCount==iCount)//进行处理
{
memcpy(m_tmp+PICPACKSIZE*(m_iRecvCount-1),pack->buffer,iBufferSize);
m_iRecvCount+=1;
if(bFinish)
{
m_iRecvCount=1;
ShowScreen(iJpegSize,m_tmp);
}
}
else
m_iRecvCount=1;
delete buffer;


在Debug模式下运行没任何问题。
在Release模式下运行也没问题,可就是一点关闭窗口就出错。
找了三天了,求求各位了。想哭……(还无泪)
...全文
139 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
这不是鸭头 2013-02-25
  • 打赏
  • 举报
回复
你代码中delete不对。内存泄漏
这不是鸭头 2013-02-25
  • 打赏
  • 举报
回复
delete []buffer;
oyljerry 2013-02-24
  • 打赏
  • 举报
回复
引用 6 楼 wxz1980 的回复:
windbg俺不知道用……我擦%
VC F5调试模式启动Release版本,然后关闭按钮事件中设置断点单步调试
一个傻冒 2013-02-23
  • 打赏
  • 举报
回复
不用windbg也行。用VC就可以的。
easyctrl 2013-02-23
  • 打赏
  • 举报
回复
windbg俺不知道用……我擦%
fishion 2013-02-23
  • 打赏
  • 举报
回复
OnClose那里的函数一个个注释掉,看看是不是哪个出问题了
jimette 2013-02-22
  • 打赏
  • 举报
回复
123 closesocket(m_Socket); WSACleanup(); GdiplusShutdown(m_pGdiToken); onclose 代码估计顺序有问题 gdiP初始化在哪里?调用的?
一个傻冒 2013-02-22
  • 打赏
  • 举报
回复
把Release优化去掉。把调试器Attach到你程序上,看看异常在哪。
easyctrl 2013-02-22
  • 打赏
  • 举报
回复
补充:在OnClose中执行以下代码
	closesocket(m_Socket);
	WSACleanup();
	GdiplusShutdown(m_pGdiToken);
easyctrl 2013-02-22
  • 打赏
  • 举报
回复
在线等待中,先谢谢了……

18,356

社区成员

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

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