?? winsockdlg.cpp
字號(hào):
do
{
//向主窗口發(fā)送消息主要用于控制進(jìn)度條
::PostMessage(hwnd,UM_PRGRECV,0,(LPARAM)cbLeftToReceive);
int iiGet, iiRecd;
iiGet = (cbLeftToReceive<RECV_BUFFER_SIZE) ?
cbLeftToReceive : RECV_BUFFER_SIZE ;
iiRecd = recv(sockConn, (char*)recdData, iiGet,0 );
if ( iiRecd == SOCKET_ERROR || iiRecd == 0 )
{
int iErr = ::GetLastError();
TRACE( "GetFileFromRemoteSite returned a socket error while getting chunked file data\n"
"\tNumber of Bytes received (zero means connection was closed) = %d\n"
"\tGetLastError = %d\n", iiRecd, iErr );
bRet = FALSE;
goto PreReturnCleanup;
}
destFile.Write( recdData, iiRecd);
cbLeftToReceive -= iiRecd;
}
while ( cbLeftToReceive > 0 );
::PostMessage(hwnd,UM_PRGROVER,0,0); //向主窗口發(fā)送消息
PreReturnCleanup: //文件接收結(jié)束標(biāo)簽
delete[] recdData; //釋放內(nèi)存
if ( bFileIsOpen )
destFile.Close();
closesocket(sockConn);
closesocket(socketrecv);
return bRet;
}
DWORD WINAPI CWinSockDlg::SocketSend(LPVOID lpParameter)
{
//將參數(shù)傳遞給本地變量
HWND hwnd=((socksend*)lpParameter)->hwnd;
CString sendfname=((socksend*)lpParameter)->sendfname;
DWORD dwip=((socksend*)lpParameter)->dwip;
SOCKET socketsend=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建Socket
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(dwip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8848);
int ret1;
ret1=connect(socketsend,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//連接指定地址
if(SOCKET_ERROR==ret1)
{
closesocket(socketsend);
::MessageBox(hwnd,"連接失敗!","警告",MB_OK);
return FALSE;
}
::PostMessage(hwnd,UM_PRGSBGN,0,0); //向主窗口發(fā)送消息
//聲明用于文件發(fā)送的本地變量
BOOL bRet = TRUE;
int fileLength, cbLeftToSend;
BYTE* sendData = NULL;
CFile sourceFile;
CFileException fe;
BOOL bFileIsOpen = FALSE;
//打開參數(shù)傳遞進(jìn)來(lái)的文件用于發(fā)送
if( !( bFileIsOpen = 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;
}
//首先傳遞將要被發(fā)送文件的長(zhǎng)度給接收端
fileLength = sourceFile.GetLength();
fileLength = htonl( fileLength );
cbLeftToSend = sizeof( fileLength );
do
{
int cbBytesSent;
BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - cbLeftToSend;
cbBytesSent = send(socketsend, (const char*)bp, cbLeftToSend,0 );
if ( cbBytesSent == 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", cbBytesSent, iErr );
bRet = FALSE;
goto PreReturnCleanup;
}
cbLeftToSend -= cbBytesSent;
}
while ( cbLeftToSend>0 );
//開始發(fā)送晚間
sendData = new BYTE[SEND_BUFFER_SIZE];
cbLeftToSend = sourceFile.GetLength();
do
{
::PostMessage(hwnd,UM_PRGSEND,0,(LPARAM)cbLeftToSend);
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 chunked file data\n"
"\tNumber of Bytes sent = %d\n"
"\tGetLastError = %d\n", doneSoFar, iErr );
bRet = FALSE;
goto PreReturnCleanup;
}
buffOffset += doneSoFar;
sendThisTime -= doneSoFar;
cbLeftToSend -= doneSoFar;
}
while ( sendThisTime > 0 );
}
while ( cbLeftToSend > 0 );
::PostMessage(hwnd,UM_PRGSOVER,0,0);//向主窗口發(fā)送消息發(fā)送完畢
PreReturnCleanup: //結(jié)束標(biāo)簽后釋放內(nèi)存
delete[] sendData;
if ( bFileIsOpen )
sourceFile.Close();
closesocket(socketsend);
return bRet;
}
void CWinSockDlg::OnOpen()
{
CFileDialog fileDlg(TRUE); //創(chuàng)建打開文件對(duì)話框
fileDlg.m_ofn.lpstrTitle="打開文件";
fileDlg.m_ofn.lpstrFilter="All Files(*.*)\0*.*\0\0"; //設(shè)定篩選
if(IDOK==fileDlg.DoModal())
{
m_sendfname=fileDlg.GetPathName();
//如果用戶選擇確定設(shè)置發(fā)送文件名并對(duì)對(duì)話框顯示做響應(yīng)調(diào)整
(GetDlgItem(IDC_EDIT1))->SetWindowText(m_sendfname);
(GetDlgItem(IDC_EDITSEND))->SetWindowText("準(zhǔn)備好發(fā)送");
Invalidate();
}
}
void CWinSockDlg::OnRecv()
{
sockrecv* sr=new sockrecv; //聲明一個(gè)接收參數(shù)結(jié)構(gòu)體
sr->hwnd=m_hWnd; //將主窗口句柄傳送給它
HANDLE handl=CreateThread(NULL,0,SocketRecv,(LPVOID)sr,0,NULL);//創(chuàng)建線程用于接收
CloseHandle(handl);
}
void CWinSockDlg::OnSend()
{
socksend* ss=new socksend; //聲明一個(gè)發(fā)送參數(shù)結(jié)構(gòu)體
//取得IP地址控件上的地址值,設(shè)定發(fā)送文件名,傳遞主窗口句柄
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(ss->dwip);
ss->sendfname=m_sendfname;
ss->hwnd=m_hWnd;
HANDLE handl=CreateThread(NULL,0,SocketSend,(LPVOID)ss,0,NULL);
CloseHandle(handl);
}
afx_msg void CWinSockDlg::onprgrecv(WPARAM wParam,LPARAM lParam)
{
//控制接收進(jìn)度條的消息響應(yīng)函數(shù)
int prgnow=(int)lParam; //將剩余接收字節(jié)作為參數(shù)傳遞給函數(shù)
if(m_beginprgrecv) //判斷是否第一次接到此消息
{
m_prgrecv.SetRange32(0,prgnow); //設(shè)置進(jìn)度條范圍
m_prgrecvpre=prgnow; //給成員變量賦值
m_beginprgrecv=FALSE; //改變標(biāo)志
}
int thistran=m_prgrecvpre-prgnow; //本次傳輸字節(jié)數(shù)
int now=m_prgrecv.GetPos(); //先前的總傳輸量
m_prgrecv.SetPos(thistran+now); //設(shè)置進(jìn)度條位置
}
afx_msg void CWinSockDlg::onprgrover(WPARAM wParam,LPARAM lParam)
{
//恢復(fù)接收狀態(tài)
m_prgrecv.SetPos(0);
m_prgrecvpre=0;
m_beginprgrecv=TRUE;
(GetDlgItem(IDC_EDITRECV))->SetWindowText("尚未準(zhǔn)備好接收");
}
afx_msg void CWinSockDlg::onprgsend(WPARAM wParam,LPARAM lParam)
{
//請(qǐng)參考接收消息響應(yīng)函數(shù)解釋
int prgnow=(int)lParam;
if(m_beginprgsend)
{
m_prgsend.SetRange32(0,prgnow);
m_prgsendpre=prgnow;
m_beginprgsend=FALSE;
}
int thistran=m_prgsendpre-prgnow;
int now=m_prgsend.GetPos();
m_prgsend.SetPos(thistran+now);
}
afx_msg void CWinSockDlg::onprgsover(WPARAM wParam,LPARAM lParam)
{
//恢復(fù)發(fā)送狀態(tài)
m_prgsend.SetPos(0);
m_prgsendpre=0;
m_beginprgsend=TRUE;
(GetDlgItem(IDC_EDITSEND))->SetWindowText("尚未準(zhǔn)備好發(fā)送");
}
afx_msg void CWinSockDlg::onprgrrdy(WPARAM wParam,LPARAM lParam)
{
(GetDlgItem(IDC_EDITRECV))->SetWindowText("準(zhǔn)備好接收");//UM_PRGRRDY消息響應(yīng)
}
afx_msg void CWinSockDlg::onprgrbgn(WPARAM wParam,LPARAM lParam)
{
(GetDlgItem(IDC_EDITRECV))->SetWindowText("開始接收"); //UM_PRGRBGN消息響應(yīng)
}
afx_msg void CWinSockDlg::onprgsbgn(WPARAM wParam,LPARAM lParam) //UM_PRGSBGN消息響應(yīng)
{
(GetDlgItem(IDC_EDITSEND))->SetWindowText("開始發(fā)送");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -