CSocket 问题 运行正常 但一段时间之后就中断

boyjin821 2009-03-25 04:50:22
写了个CSocket通讯用,传递一个字符串数组,接受和还原都没有问题 定时15分钟发送一次 但是不知道为什么 每个2-3天就发送不了了 接收端的程序就死住了!
下面是发送和接受的程序 期盼高手解决~~


发送:
AfxSocketInit(NULL);
CStringArray straSQL;
straSQL.Copy(*paSQL);
CSocket sockRecv;
sockRecv.Create();
BOOL bDontLinger=FALSE;
if (!sockRecv.Connect(strAddress,atoi(strPort)))
{
sockRecv.SetSockOpt(SO_DONTLINGER,(const char *)&bDontLinger,sizeof(bDontLinger),SOL_SOCKET);
sockRecv.Close();
CString Log(strAddress);
Log+="无法连接网络端口";
RegisterLog((LPCTSTR)Log);
return FALSE;
}

BYTE buf[MAXBUF+1] = "\0";
int iType;
iType = 2;
sockRecv.Send(&iType, 4);
int iLen;
iLen = straSQL.GetSize();
sockRecv.Send(&iLen, 4);

for (int i=0;i<iLen;i++)
{
int iSQLLen;
iSQLLen = straSQL[i].GetLength();

sockRecv.Send(&iSQLLen,4);

int nSend = 0;
int j = 0;
int nbufLength = 1000;
int nReadLength = 0;
int nTemp = iSQLLen;
BYTE buf[1000] = "\0";
while (nSend < iSQLLen)
{
nReadLength = (nTemp<nbufLength)?nTemp:nbufLength;
memcpy(buf,straSQL[i].Mid(j*1000,nReadLength),nReadLength);
UINT sd = 0;
while(sd<nReadLength)
{
UINT n = 0;
n = sockRecv.Send(buf+sd, nReadLength-sd);
if(n==SOCKET_ERROR)
{
CString Log(strAddress);
Log+="发送停电信息失败";
RegisterLog((LPCTSTR)Log);
sockRecv.SetSockOpt(SO_DONTLINGER,(const char *)&bDontLinger,sizeof(bDontLinger),SOL_SOCKET);
sockRecv.ShutDown(2);
sockRecv.Close();
return FALSE;
}

sd += n;
}
j++;
nSend += nReadLength;
nTemp -= nReadLength;
}
}
sockRecv.ShutDown(2);
sockRecv.Close();
RegisterLog("发送停电信息成功");
return TRUE;


还原:
SetCursor(AfxGetApp () ->LoadStandardCursor (IDC_WAIT));
CDBRSTOREApp* pApp=(CDBRSTOREApp*)AfxGetApp();
int iType;
pSocket->Receive(&iType, 4);

if(iType == 2)
{
CStringArray straSQL;
CString strTemp;
int iCount,iSQLLen;
char charSQL[1000] = {0};
CString strMessage;
char cSQL[20000] = {0};

pSocket->Receive(&iCount, 4); //Now we get the File Size first

for (int i=0;i<iCount;i++)
{
strTemp = "";
iSQLLen = 0;
int nResult = pSocket->Receive(&iSQLLen, 4);
if (nResult == SOCKET_ERROR)
{
break;
}


int dataLenght = iSQLLen;
int k = 0;
while (dataLenght > 0)
{
memset(&charSQL,0,1000);
DWORD len = (dataLenght<1000)?dataLenght:1000;
DWORD n = pSocket->Receive(&charSQL,len);
memcpy(cSQL+k,charSQL,n);
k = k + n;
dataLenght = dataLenght -n;
}
straSQL.Add(cSQL);
strMessage.Format(cSQL);
memset(cSQL,0,20000);
}
pSocket->Close();
pApp->m_aRunSQL.RemoveAll();
pApp->m_aRunSQL.Copy(straSQL);
pApp->RegisterLog("停电信息接收成功");
ReleaseCapture();
return 2;
}
return 0;
...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
king_query 2009-03-27
  • 打赏
  • 举报
回复
while (dataLenght > 0)
{
memset(&charSQL,0,1000);
DWORD len = (dataLenght <1000)?dataLenght:1000;
DWORD n = pSocket->Receive(&charSQL,len);
memcpy(cSQL+k,charSQL,n);
k = k + n;
dataLenght = dataLenght -n;
}


如果一个包没有发完,你的SOCKET关了,那你这里是不是进了死循环?
DWORD n = pSocket->Receive(&charSQL,len); 是不是要看一下SOCKET关闭了没有?



boyjin821 2009-03-26
  • 打赏
  • 举报
回复
一直没有写过CSocket的东西,时间太紧都没有太多时间来看,期望高手能说的详细一点。切切~~
hust_terry 2009-03-25
  • 打赏
  • 举报
回复
问题太大,建议多加些调试信息。
oyljerry 2009-03-25
  • 打赏
  • 举报
回复
增加一些调试信息等,看程序死在哪里...
如上,对于大数据,应该new分配到堆上...
Wenxy1 2009-03-25
  • 打赏
  • 举报
回复
大的buffer最好用heap内存。
buffer使用前要清零。
调用函数要检查返回值。
变量使用前要清零等都是一个好习惯。
cnzdgs 2009-03-25
  • 打赏
  • 举报
回复
调用Receive函数要根据函数的返回值来确定实际接收到多少数据,如果即使只接收2字节也要判断。
另外,cSQL[20000]占20KB空间,这种数组不宜在栈中分配,最好用new分配,以免栈空间使用过多造成溢出。
百事烟 2009-03-25
  • 打赏
  • 举报
回复
原因很多,光看代码也说不出来什么
几个建议

同时测试两端,设定每秒发送N次,看是否有内存泄漏

两端都要加收跳包,发现异常自动重连.

安个看门狗,程序死了重启程序,系统挂了重启系统

写日志文件,看看到哪断的

还有就是网络断开你是怎么处理的?

18,356

社区成员

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

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