0xC000005 kernel32.dll问题 一个奇怪的问题。
SendFile函数 网络上传文件:
void SendFile(CSocket& getsocket,CFile &hf){
int size=hf.GetLength()/1024;
for(int i=0;i<size;i++){
char temp[1024]={0};
hf.Read(temp,1024);
getsocket.Send(temp, 1024);
hf.Seek(1024*(i+1),CFile::begin);
}
char newtemp[1024]={0};
hf.Read(newtemp,1024);
getsocket.Send(newtemp,1024);
AfxMessageBox(_T(newtemp));
}
CTimeOutSocket sockServer;
if(!AfxSocketInit()){
MessageBox(_T("套接字初始化问题!"),_T("内部错误"));
return;
}
if(!sockServer.Create()){
MessageBox(_T("套接字创建出现问题!"),_T("内部错误"));
return;
}
if(!sockServer.SetTimeOut(50000000)){
MessageBox(_T("超时设置失败!"),_T("内部错误"));
};
CFile hf;
CFileException fe;
char* pFileName = "C:\\avgfaceimage.xml";
if(!hf.Open(pFileName, CFile::modeRead, &fe))
{
MessageBox(_T("系统文件读取故障!"),_T("内部错误"));
return;
}
if(sockServer.Connect("127.0.0.1",1000)){
char szRecValue[1024] = {0};
CString strfirst;
DWORD filelength=hf.GetLength();
strfirst.Format("#Size#%d#",filelength);
sockServer.Send(strfirst, 24);
sockServer.Receive((void *)szRecValue, 1024);
strfirst=_T(szRecValue);
int size=filelength/1024;
if(strfirst==_T("#Ready#")){
SendFile(sockServer,hf);//去掉这个函数一下面一样被注释的代码代替就不会出错
// for(int i=0;i<size;i++){
// char temp[1024]={0};
// hf.Read(temp,1024);
// sockServer.Send(temp, 1024);
// hf.Seek(1024*(i+1),CFile::begin);
// }
// char newtemp[1024]={0};
// hf.Read(newtemp,1024);
// sockServer.Send(newtemp,1024);
char returnmsg[50]={0};
sockServer.Receive(returnmsg,1024);
CString msgstr=_T(returnmsg);
CString finalstr;
if(sockServer.IsTimeOut()){
sockServer.SetIsTimeOut(false);
MessageBox(_T("传输超时,请重传!"),_T("内部错误"));
return;
}
if(AfxExtractSubString(finalstr,msgstr,1,'#')){
if(finalstr==_T("Success")){
char res[1024]={0};
sockServer.Receive(res,1024);
finalstr=_T(res);
CString comt[2];
int filesize;
CFile wf;
CFileException we;
char* pFileName = "C:\\avg.txt";
if(!wf.Open(pFileName, CFile::modeCreate|CFile::modeWrite, &we))
{
AfxMessageBox(_T("内部错误!"));
return;
}
if(AfxExtractSubString(comt[0],finalstr,1,'#')){
if(comt[0]==_T("Size")){
if(AfxExtractSubString(comt[1],finalstr,2,'#')){
filesize=atoi(comt[1]);
sockServer.Send("#Ready#",1024);
ReceiveFile(sockServer,filesize,wf);
/* int size=filesize/1024;
//AfxMessageBox(_T("这里被执行了!"));
for(int i=0;i<size;i++){
char temp[1024]={0};
sockServer.Receive(temp, 1024);
wf.Write(temp,1024);
wf.Seek(1024*(i+1),CFile::begin);
}
char newtemp[1024]={0};
sockServer.Receive(newtemp,1024);
CString laststr;
laststr=_T(newtemp);
MessageBox(laststr);
wf.Write(laststr,laststr.GetLength());
*/ char xtemp[1024]={0};
CString laststr;
sockServer.Receive(xtemp,1024);
CString xlaststr=_T(xtemp);
if(AfxExtractSubString(laststr,xlaststr,1,'#')){
if(laststr==_T("Success")){
if(IDOK==MessageBox(_T("是否确认本次考勤!"),_T("提示"),MB_YESNO)){
sockServer.Send("#Certain#",100);
}else{
sockServer.Send("#Cancel#",100);
}
}else{
MessageBox(_T("不可靠网络传输"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("不可靠网络传输"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("不可靠网络传输"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("不可靠网络传输!"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("不可靠网络传输!"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("服务器接收数据失败"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("网络连接丢失,请重新连接"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("网络连接失败请重新发送!"),_T("外部错误"));
return;
}
}else{
MessageBox(_T("无法连接服务器请重试!"),_T("外部错误"));
return;
}
if(!sockServer.KillTimeOut()){
MessageBox(_T("关闭超时失败!"),_T("内部错误"));
};
sockServer.Close();
红色部分用SendFile()函数代替就这个函数就会出现问题:
Unhandled exception in xxx.exe:Kernel32.dll:0Xc000005 access viloation
但是不是在调用SendFile()时出错而且好像SendFIle的代码是正常执行了的 是在后面其他地方突然跳出
当然如果不要SendFile()函数用SendFile里面的代码直接代替SendFIle()函数调用的化 就不会有问题.
看有没有人你解决。