CSocket第二次Accept出错

时间:2021-04-03 09:05:06
近期在做Wince的MFC TCP/IP编程,很古老了了,课题需要,没办法。Wince设备上运行服务器程序,第一次服务器的CSocket接收请求正常,但是当第二次接收请求时就崩溃了。求教,我把代码贴出来供大家指导。
if (!HostSocket.Create(BINDPORT))
{
theView->OutputMessage(L"创建HostSocket失败");
}
HostSocket.Listen();

while (!isExit)
{
theView->OutputMessage(_T("手持端已就绪!"));
CSocket ClientSocket;
HostSocket.Accept(ClientSocket);
//CMySocket* lpMySocket=(CMySocket*)lpParameter;
CSocketFile FileSocket(&ClientSocket);
CArchive LoadArchive(&FileSocket,CArchive::load);
CRequestCommand* com=NULL;
com=(CRequestCommand*)LoadArchive.ReadObject(RUNTIME_CLASS(CRequestCommand));
LoadArchive.Close();
if (com)
{
int command=com->m_iCommand;
switch(command){
case GETPARTINFOMATION:
{
break;
}
case GETPARTSINFOMATION:
{
break;
}
case GETSTAFFID:
{
CCardInfo* ccf=new CCardInfo;
CRFIDControl cc;
cc.MESAX_ReadEPC(ccf);
if (!(STAFFCARD==ccf->GetCardType()))
ccf->SetOperSuccess(false);
CArchive StoreArchive(&FileSocket,CArchive::store);
StoreArchive.WriteObject(ccf);
StoreArchive.Flush();
delete ccf;
StoreArchive.Close();
FileSocket.Close();
}
break;
default:
break;
}
}else
theView->OutputMessage(L"未接收到指令");
ClientSocket.Close();
}
HostSocket.Close();
WSACleanup();
return 1;

即当处理第二次请求时,程序就在第11行Accept那崩溃了。另外,本来想把每一个请求放在一个新线程里处理的,但是这样会出错,出错的位值在利用CSocketFile生成CArchive的那一句,如CArchive LoadArchive(&FileSocket,CArchive::load);//这句放在子线程中会出错。请大家指教,谢谢!!

4 个解决方案

#1


最好再分配一个 ClientSocket ,不是用原来的,这有很多socket源码,你参考一下吧:
http://download.csdn.net/detail/geoff08zhang/4571358

#2


if (!HostSocket.Create(BINDPORT))    
{       
     theView->OutputMessage(L"创建HostSocket失败");    
    return; //增加这一行,结束函数
}

上面这样试一下,可能是你第二次创建socket是失败的

另外,你socket服务用完后,有没有closesocket

#3


引用 2 楼 baodi_z 的回复:
if (!HostSocket.Create(BINDPORT))    
{       
     theView->OutputMessage(L"创建HostSocket失败");    
    return; //增加这一行,结束函数
}

上面这样试一下,可能是你第二次创建socket是失败的

另外,你socket服务用完后,有没有closesocket

这样用过了,写了个CSocket的子类,直接调用listen()后,退出。但是这样通信会出现问题,服务器在OnSend()里面发送数据,接着close().客户端接收完数据也close()。结果就是程序卡死了,客户端下次连接也连接不上

#4


引用 1 楼 laqhelen 的回复:
最好再分配一个 ClientSocket ,不是用原来的,这有很多socket源码,你参考一下吧:
http://download.csdn.net/detail/geoff08zhang/4571358

好的,我先看看。谢谢

#1


最好再分配一个 ClientSocket ,不是用原来的,这有很多socket源码,你参考一下吧:
http://download.csdn.net/detail/geoff08zhang/4571358

#2


if (!HostSocket.Create(BINDPORT))    
{       
     theView->OutputMessage(L"创建HostSocket失败");    
    return; //增加这一行,结束函数
}

上面这样试一下,可能是你第二次创建socket是失败的

另外,你socket服务用完后,有没有closesocket

#3


引用 2 楼 baodi_z 的回复:
if (!HostSocket.Create(BINDPORT))    
{       
     theView->OutputMessage(L"创建HostSocket失败");    
    return; //增加这一行,结束函数
}

上面这样试一下,可能是你第二次创建socket是失败的

另外,你socket服务用完后,有没有closesocket

这样用过了,写了个CSocket的子类,直接调用listen()后,退出。但是这样通信会出现问题,服务器在OnSend()里面发送数据,接着close().客户端接收完数据也close()。结果就是程序卡死了,客户端下次连接也连接不上

#4


引用 1 楼 laqhelen 的回复:
最好再分配一个 ClientSocket ,不是用原来的,这有很多socket源码,你参考一下吧:
http://download.csdn.net/detail/geoff08zhang/4571358

好的,我先看看。谢谢