自己写了一个网络收发文件的程序,发文件的时候有问题,不知道该怎么解决
BOOL CFileTransferDlg::SendFileToRemoteRecipient(CString fName)  //发送文件名
{ // local variables used in file transfer
BOOL bRet = TRUE;
CString CFilename;

CFile sourceFile;
CFileException fe;
BOOL bFileIsOpen = FALSE; if( !( bFileIsOpen = sourceFile.Open( fName, CFile::modeRead | CFile::typeBinary, &fe ) ) )
{
MessageBox(_T("打开文件错误!"));
bRet = FALSE;
goto PreReturnCleanup;
} int iLeftSend;
int ret;
do
{ iLeftSend = WideCharToMultiByte(CP_THREAD_ACP, 0, FileName.GetBuffer(), -1, NULL, 0,NULL,NULL);
if( iLeftSend > 10240 )
{
iLeftSend = 10240;
}
iLeftSend = WideCharToMultiByte(CP_THREAD_ACP, 0, FileName.GetBuffer(), -1, psText, iLeftSend,NULL,NULL);
ret = send( Client, psText, iLeftSend, 0);
if ( ret == SOCKET_ERROR )
{
MessageBox(_T("发送文件名错误!"));
bRet = FALSE;
goto PreReturnCleanup;
}
iLeftSend -= ret;
}
while(iLeftSend>0);

PreReturnCleanup:
if ( bFileIsOpen )
sourceFile.Close();
return bRet;
}
BOOL CFileTransferDlg::SendFile()  //发送文件内容
{
// local variables used in file transfer
BOOL bRet = TRUE;
CString CFilename;
int fileLength, cbLeftToSend;
sendData = NULL;

CFile sourceFile;
CFileException fe;
BOOL bFileIsOpen = FALSE;
if( !( bFileIsOpen = sourceFile.Open( SendFileName, CFile::modeRead | CFile::typeBinary, &fe ) ) )
{
MessageBox(_T("打开文件错误!"));
bRet = FALSE;
goto PreReturnCleanup;
} fileLength = sourceFile.GetLength();
fileLength = htonl( fileLength );
cbLeftToSend = sizeof( fileLength );
// send length of file
do
{
int cbBytesSent;
char* bp = (char*)((char*)(&fileLength) + sizeof(fileLength) - cbLeftToSend);;
cbBytesSent = send( Client,bp, cbLeftToSend, 0); if ( cbBytesSent == SOCKET_ERROR )
{
MessageBox(_T("发送文件长度错误"));
bRet = FALSE;
goto PreReturnCleanup;
}

cbLeftToSend -= cbBytesSent;
}
while ( cbLeftToSend>0 );
//
// send the file's data
sendData = new char[SEND_BUFFER_SIZE]; 

cbLeftToSend = sourceFile.GetLength();

do
{
int sendThisTime, doneSoFar, buffOffset;

sendThisTime = sourceFile.Read( sendData, SEND_BUFFER_SIZE );
buffOffset = 0;

do
{
doneSoFar = send( Client,sendData + buffOffset, sendThisTime,0 );
//运行此处发送不了文件
if ( doneSoFar == SOCKET_ERROR )
{
MessageBox(_T("发送文件错误!"));

bRet = FALSE;
goto PreReturnCleanup;
}
//data  sent
buffOffset += doneSoFar;
sendThisTime -= doneSoFar;
cbLeftToSend -= doneSoFar;
}
while ( sendThisTime > 0 );

}
while ( cbLeftToSend > 0 );
PreReturnCleanup:

delete[] sendData;

if ( bFileIsOpen )
sourceFile.Close();
closesocket(Client);

return bRet;

}
LRESULT CFileTransferDlg::OnSocketRead(WPARAM wParam, LPARAM lParam)   //接收文件
{
//int ret;
//int dataLength, cbBytesRet, cbLeftToReceive;
SOCKET socket = (SOCKET)wParam;
getpeername( socket, (LPSOCKADDR)&clientaddr,&clientaddrlen); switch( WSAGETSELECTEVENT(lParam) )
{
case FD_READ:
if(m_bFile == FALSE)
{
                        //接收文件名
CFileException fe;
BOOL bFileIsOpen = FALSE;
BOOL bRet = TRUE;
BOOL bFile = FALSE;
CString filename;
char* recdData = NULL; m_bFile = TRUE;
int ret;
ret = recv( socket, msg, sizeof(msg), 0 );
if( ret != SOCKET_ERROR )
{
dwWCharSize = MultiByteToWideChar( CP_ACP, 0, msg, -1, NULL, 0 );
if( dwWCharSize > 10240 )
{
dwWCharSize = 10240;
}
MultiByteToWideChar( CP_ACP, 0, msg, -1, pwText, dwWCharSize );
filename.Format( _T("%s"), pwText); CFileDialog outDlg(FALSE, NULL, filename, NULL, _T("所有文件 (*.*)|*.*|"), NULL);//设定保存对话框标题 outDlg.m_ofn.lpstrTitle = _T("保存文件"); if(outDlg.DoModal() == IDOK)                //显示对话框
{ if(file.Open(outDlg.GetPathName(), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)) //得到文件名,并用创建和写入方式打开
{ strLocalFileName = outDlg.GetPathName();
file.Close();
}  if ( -1 != strLocalFileName.FindOneOf( _T(";*?\"<>|" )) )
{ MessageBox(_T("文件名包含无效字符!"));
// return;
}
bFile = TRUE;
} } if(bFile == TRUE)
{
bFile = FALSE;
int iLeftSend;
int iRet; iLeftSend = WideCharToMultiByte(CP_THREAD_ACP, 0, filename.GetBuffer(), -1, NULL, 0,NULL,NULL);
if( iLeftSend > 10240 )
{
iLeftSend = 10240;
}
iLeftSend = WideCharToMultiByte(CP_THREAD_ACP, 0, filename.GetBuffer(), -1, psText, iLeftSend,NULL,NULL); iRet = send( socket, psText, iLeftSend, 0);  //向发送方发送一消息
if(iRet == SOCKET_ERROR)
{
goto PreReturnCleanup; }PreReturnCleanup:
delete[] recdData;
if ( bFileIsOpen )
file.Close();
}
else
{
                                   //接收文件
m_bFile = FALSE;
int dataLength, cbBytesRet, cbLeftToReceive;
CFileException fe;
BOOL bFileIsOpen = FALSE;
BOOL bRet = TRUE;
BOOL bFile = FALSE;
CString filename;
char* recdData = NULL;
if( !( bFileIsOpen = file.Open( strLocalFileName,CFile::modeWrite | CFile::typeBinary, &fe ) ) )
{
MessageBox(_T("打开文件时发生错误!")); bRet = FALSE;
goto PreReturnCleanup;
}
cbLeftToReceive = sizeof( dataLength );
do
{
char* bp ;
bp =NULL;
bp = (char*)(&dataLength) + sizeof(dataLength) - cbLeftToReceive; cbBytesRet = recv(ClientSocket ,bp, cbLeftToReceive,0 ); if ( cbBytesRet == SOCKET_ERROR || cbBytesRet == 0 )
{
MessageBox(_T("获得文件长度时发生错误!"));
bRet = FALSE;
goto ReturnCleanup;
}
//data retrieved
cbLeftToReceive -= cbBytesRet; }
while ( cbLeftToReceive > 0 ); dataLength = ntohl( dataLength ); // get the file
recdData = new char[RECV_BUFFER_SIZE];
cbLeftToReceive = dataLength; do
{
int iiGet, iiRecd; iiGet = (cbLeftToReceive<RECV_BUFFER_SIZE) ? cbLeftToReceive : RECV_BUFFER_SIZE ; iiRecd = recv(ClientSocket ,recdData, iiGet ,0); if ( iiRecd == SOCKET_ERROR || iiRecd == 0 )
{ MessageBox(_T("接收文件时发生错误!"));
bRet = FALSE;
goto ReturnCleanup;
}
// data retrieved
file.Write( recdData, iiRecd); 
cbLeftToReceive -= iiRecd; } 
while ( cbLeftToReceive > 0 );
ReturnCleanup:
delete[] recdData; if ( bFileIsOpen )
file.Close(); }
}

case FD_CLOSE:
closesocket( socket );
}
return 0L;
}
问题出在哪里啊?望高手指教!

解决方案 »

  1.   

    补充一下:
    在发送的时候就出出了问题,
    do

    int sendThisTime, doneSoFar, buffOffset;sendThisTime = sourceFile.Read( sendData, SEND_BUFFER_SIZE );
    buffOffset = 0;do
    {
    doneSoFar = send( Client,sendData + buffOffset, sendThisTime,0 ); //此处出现问题,循环的时候,发送失败。不知道为什么会失败。
    //运行此处发送不了文件
    if ( doneSoFar == SOCKET_ERROR )
    {
    MessageBox(_T("发送文件错误!"));bRet = FALSE;
    goto PreReturnCleanup;
    }
    //data sent
    buffOffset += doneSoFar;
    sendThisTime -= doneSoFar;
    cbLeftToSend -= doneSoFar;
    }
    while ( sendThisTime > 0 );}
    while ( cbLeftToSend > 0 );
      

  2.   

    你这个client是阻塞还是非阻塞啊,阻塞的话,返回错误正常啊,非阻塞的话,就getlasterror看看什么错误.
      

  3.   

    WINDOW下传输文件,建议用:TransmitFile