下边代码是一个基于TCP传文件的
文件传送成功,但在关闭改程序前,不能打开所传的文件,说另一个程序正式使用
请问是怎么回事代码如下:一个菜单响应函数(用语传文件)
void CXiangMUDlg::OnSendFile() 
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE);
CString strFullName;//文件全名
if(IDOK==dlg.DoModal())
{
strFullName=dlg.GetPathName();
}
WSADATA wsasata;
WSAStartup(0x0202,&wsasata);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(PORTFILE);
addrSrv.sin_addr.S_un.S_addr=inet_addr(m_IPSelected);

SOCKET socketCilent=socket(AF_INET,SOCK_STREAM,0);
if(SOCKET_ERROR==connect(socketCilent,(sockaddr *)&addrSrv,sizeof(SOCKADDR_IN)))
{
AfxMessageBox("Connect Error in Client");
return;
}
CFile fileSend;
char *pFullName=new char[500];
//调用自定义函数GetContentfromCString把CString类型转化为 char *
int iLength=GetContentfromCString(strFullName,pFullName);
pFullName[iLength]='\0';
if(!fileSend.Open(pFullName,CFile::modeRead | CFile::typeBinary))
{
return;
}
delete pFullName;
char * pFileName=new char[100];
//调用自定义函数GetContentfromCString把CString类型转化为 char *
int iLen=GetContentfromCString(fileSend.GetFileName(),pFileName);
pFileName[iLen]='\0';
send(socketCilent,pFileName,iLen,0);
delete pFileName;
int Length=fileSend.GetLength();
CString strLen;
strLen.Format("%d",Length);
char *pLen=new char [50];
//调用自定义函数GetContentfromCString把CString类型转化为 char *
int iLenofLen=GetContentfromCString(strLen,pLen);
pLen[iLenofLen]='\0';
send(socketCilent,pLen,iLenofLen,0);
delete pLen;
char BufFile[FILESIZE]={0};
int num=0;
int temp=0;
fileSend.Seek(0,CFile::begin);
while(TRUE)
{
num=fileSend.Read(BufFile,FILESIZE);
send(socketCilent,BufFile,num,0);
if(!num)
{
break;
}
temp+=num;
}
if(temp==fileSend.GetLength())
{
CString str;
str.Format("%d",temp);
// AfxMessageBox(str);
AfxMessageBox("文件发送成功");
}
else
{
CString str;
str.Format("%d",temp);
// AfxMessageBox(str);
AfxMessageBox("文件发送失败");
}
fileSend.Close();
}一个接收线程(在主线程中创建)
DWORD WINAPI RecvFile(LPVOID lpParameter)
{
WSADATA wsasata;
WSAStartup(0x0202,&wsasata);
SOCKADDR_IN addrSrv,addrClient;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(PORTFILE);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
SOCKET socket1=socket(AF_INET,SOCK_STREAM,0);
bind(socket1,(sockaddr *)&addrSrv,sizeof(SOCKADDR_IN));
listen(socket1,5);
int iLen=sizeof(SOCKADDR_IN);
char BufRecv[1024]={0};
while(TRUE)
{
SOCKET socket2=accept(socket1,(sockaddr *)&addrClient,&iLen);
//接收文件名
recv(socket2,BufRecv,1024,0);
CString str;
str.Format("c:\\%s",BufRecv);
char * pPath=new char[300];//pPath为指向 新建的文件路径及文件名 字符串的指针
//调用自定义函数GetContentfromCString把CString类型转化为 char *
int iLen=GetContentfromCString(str,pPath);
// AfxMessageBox(str);
memset(BufRecv,0,1024);
//接收文件长度
recv(socket2,BufRecv,1024,0);
// AfxMessageBox(BufRecv);
int LenFile=atoi(BufRecv);
//接收文件内容
CFile FileRecv(pPath,CFile::modeCreate|CFile::modeWrite);
delete pPath;
int num=0;
int temp=0;
// AfxMessageBox("运行到此1");
while(TRUE)
{
memset(BufRecv,0,1024);
int num=recv(socket2,BufRecv,1024,0);
// AfxMessageBox("运行到此2");
// CString strTest;
// strTest.Format("num:%d",num);
// AfxMessageBox(BufRecv);
temp+=num;
FileRecv.Write(BufRecv,num);
if(0==num)
{
break;
}
}
FileRecv.Close();
if(temp==iLen)
{
AfxMessageBox("文件接收成功");
}
else
{
AfxMessageBox("文件接收失败");
}
}
}
文件传成功了,且数据没有错误
但没有一个关于"文件接收成功"的对话框出现请问是怎么回事啊

解决方案 »

  1.   

    打开文件时,加上CFile::shareDenyNone试下if(!fileSend.Open(pFullName,CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone))
      

  2.   

    while(TRUE) 

    memset(BufRecv,0,1024); 
    int num=recv(socket2,BufRecv,1024,0); 
    temp+=num; 
    FileRecv.Write(BufRecv,num); 
    if(temp==iLen) <-----------------------------------改为这个

    break; 


      

  3.   

    Open(strFile, CFile::modeRead |CFile::shareDenyWrite)
    试试更改一下Open的参数