socket的recv返回-1时,的报错,

wxliangzyt 2013-10-26 04:29:50

代码如下:

DWORD WINAPI CIOCPServer::ThreadConserPoolProc(LPVOID lpParam)
{
//连接主服务器的线程
CIOCPServer* pcs=(CIOCPServer*)lpParam;
WSADATA data = {0};
SOCKET m_Socket;
recvMsg msgg;

TCHAR szBuf[MAX_BUF_SIZE] = {0};
try
{
memset(msgg.sendtype,0,2);
memset(msgg.sendno,0,30);
memset(msgg.seda,0,100);
memset(msgg.sedb,0,100);
memset(msgg.sedc,0,100);
memset(msgg.sedd,0,100);
memset(msgg.sede,0,100);
memset(msgg.sedf,0,100);
memset(msgg.sedg,0,100);
memset(msgg.sedh,0,100);
memset(msgg.sedi,0,100);

if(WSAStartup(MAKEWORD(2, 2), &data))
return FALSE;
if ( LOBYTE(data.wVersion) !=2 || HIBYTE(data.wVersion) != 2 )
{
WSACleanup();
return FALSE;
}
m_Socket = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(9527);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(m_Socket, (struct sockaddr *)&server, sizeof(struct sockaddr)) == SOCKET_ERROR )
{
AfxMessageBox(_T("连接失败,请重试!"));
WSACleanup();
return FALSE;
}
pcs->skt=m_Socket;
memcpy(msgg.sendtype, "a", sizeof("a") );
//-----------------unicode下:CString转char[]的方法-------------------------------------
WideCharToMultiByte(CP_ACP,0,pcs->pcno,pcs->pcno.GetLength(),msgg.sendno,sizeof(msgg.sendno),NULL,NULL);
::send(pcs->skt,(char *)&msgg, sizeof(msgg),0);
while(TRUE)
{
memset(szBuf,0,MAX_BUF_SIZE);
recvMsg msggrvd;
memset(msggrvd.sendtype,0,2);
memset(msggrvd.sendno,0,30);
memset(msggrvd.sendskt,0,10);
memset(msggrvd.seda,0,100);
memset(msggrvd.sedb,0,100);
memset(msggrvd.sedc,0,100);
memset(msggrvd.sedd,0,100);
memset(msggrvd.sede,0,100);
memset(msggrvd.sedf,0,100);
memset(msggrvd.sedg,0,100);
memset(msggrvd.sedh,0,100);
memset(msggrvd.sedi,0,100);

int iRet = recv(m_Socket, (char *)szBuf, MAX_BUF_SIZE, 0);
if ( iRet > 0 )
{
memcpy(&msggrvd,szBuf,sizeof(szBuf));
CIcpwes *opw=new CIcpwes(pcs,msggrvd);
QueueUserWorkItem(WorkThreadPoolProc, opw, WT_EXECUTELONGFUNCTION);
}
else
{
// WSACleanup();
memset(szBuf,0,MAX_BUF_SIZE);
CString lstxt;
lstxt="服务器断开连接,请重新启动";
pcs->m_pWnd->SendMessage(WM_ADD_MSG,(DWORD)0,(LPARAM)(LPCTSTR)lstxt);
break;
}
}

closesocket(m_Socket);
return TRUE;
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format(_T("连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
return TRUE;
}
}


服务端,客户端,都在BUG状态,我突然停掉服务端时,客户端会报以下错误:
1:有时报:Run-Time Check Failure #2 - Stack around variable 'szBuf' was corrupted
2:有时报:Run-Time Check Failure #2 - Stack around variable 'msggrvd' was corrupted

请高手指点,始终找不到原因
...全文
122 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rsdtt 2013-10-28
  • 打赏
  • 举报
回复
不知道你部分定义的大小,应该用sizeof(msggrvd)避免越界
wxliangzyt 2013-10-26
  • 打赏
  • 举报
回复
如果我注释:memcpy(&msggrvd,szBuf,sizeof(szBuf));这句就oK 如果注释这句,我怎么赋值呀

18,356

社区成员

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

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