18,356
社区成员
发帖
与我相关
我的任务
分享
DWORD CInstantmessageDlg:: SendFile(LPVOID lpParameter)
{
//PASS THE PARAMETER TO LOCAL VARIABLE
HWND hwnd=((Parameter_socksend*)lpParameter)->hwnd;
CString sendfname=((Parameter_socksend*)lpParameter)->sendfname;
DWORD dwip=((Parameter_socksend*)lpParameter)->dwip;
m_beginprgsend=TRUE;
SOCKET socketsend=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(dwip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4514);
if(SOCKET_ERROR==connect(socketsend,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))//CONNECT THE SPECIFIED DETINATION
{
closesocket(socketsend);
::MessageBox(hwnd,"CONNECTION FAILED!","WARNING",MB_OK);
return FALSE;
}BOOL bRet = TRUE;
上满都是一些定义,没看头
下面才是最重要的啊
int fileLength, LeftToSend;
int BytesSent;
BYTE* sendData = NULL;CFile sourceFile;
CFileException fe;
BOOL FileIsOpen = FALSE;
if( !( FileIsOpen = sourceFile.Open( sendfname,
CFile::modeRead | CFile::typeBinary, &fe ) ) )//问题一:这里面的条件具体指什么
{
TCHAR strCause[256];
fe.GetErrorMessage( strCause, 255 );
TRACE( "SendFileToRemoteRecipient encountered an error while opening the local file\n"
"\tFile name = %s\n\tCause = %s\n\tm_cause = %d\n\tm_IOsError = %d\n",
fe.m_strFileName, strCause, fe.m_cause, fe.m_lOsError );
//问题二:这个宏是干嘛的啊,还跟个数组
bRet = FALSE;
goto PreReturnCleanup;
}
fileLength = htonl( sourceFile.GetLength());
LeftToSend = sizeof( fileLength );
do
{
BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - LeftToSend;
BytesSent = send(socketsend, (const char*)bp, LeftToSend,0 );
if ( BytesSent == SOCKET_ERROR )
{
int iErr = ::GetLastError();
TRACE( "SendFileToRemoteRecipient returned a socket error while sending file length\n"
"\tNumber of Bytes sent = %d\n"
"\tGetLastError = %d\n",BytesSent, iErr );
bRet = FALSE;
goto PreReturnCleanup;
}
LeftToSend -= BytesSent;
}
while ( LeftToSend>0 );
sendData = new BYTE[SEND_BUFFER_SIZE];
LeftToSend = sourceFile.GetLength();
do
{
::PostMessage(hwnd,UM_PRGSEND,0,(LPARAM)LeftToSend);
int sendThisTime, doneSoFar, buffOffset;
sendThisTime = sourceFile.Read( sendData, SEND_BUFFER_SIZE );
buffOffset = 0;
do
{
doneSoFar = send(socketsend,(const char*) (sendData + buffOffset),
sendThisTime,0 );
if ( doneSoFar == SOCKET_ERROR )
{
int iErr = ::GetLastError();
TRACE( "SendFileToRemoteRecipient returned a socket error while sending file data\n"
"\tNumber of Bytes sent = %d\n"
"\tGetLastError = %d\n", doneSoFar, iErr );
bRet = FALSE;
goto PreReturnCleanup;
}
buffOffset += doneSoFar;
sendThisTime -= doneSoFar;
LeftToSend -= doneSoFar;
}
while ( sendThisTime > 0 );
}
while ( LeftToSend > 0 );
PreReturnCleanup:
delete[] sendData;
if ( FileIsOpen )
sourceFile.Close();
closesocket(socketsend);
return bRet;
}
问题三:最关键的是,就是它为什么搞两个do while,前一个不是只传送文件长度信息的吗