自己写了一个网络收发文件的程序,发文件的时候有问题,不知道该怎么解决
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;
}
问题出在哪里啊?望高手指教!
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;
}
问题出在哪里啊?望高手指教!
解决方案 »
- Debug和Release到底有什么本质区别
- 8** 在线等待: 第一次写模板函数, 为什么提示:"fatal error C1001: INTERNAL COMPILER ERROR":
- 请大家提供个编成思路!!
- 关于活动窗口和窗口可见性的疑惑!
- 怎么让CProgressCtrl对象窗口显示文本?
- 我的窗口用ShowWindow(SW_HIDE)隐藏,如何访止别的程序用ShowWindow(hWnd,SW_SHOW)把我的窗口给显示?
- 怎么让slider的滑块停在中间??在线...
- 怎么安装OCX控件啊?急急急!!!!
- 文件属性?
- 再次送分
- CSocket请求高手
- 专科刚毕业找不到工作郁闷中
在发送的时候就出出了问题,
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 );