?? socket.txt
字號:
時間問題,在轉載這個代碼前,沒有經過測試,大家自己測試一下,如果有什么問題,再跟我們聯系。
//1:顯示文件進度
//2:可以隨時終止傳輸過程
//發送數據線程
UINT SendDataThread(LPVOID lpParam);
//接收數據線程
UINT ReceiveDataThread(LPVOID lpParam);
//發送數據按鈕消息響應函數
void CTzg004Dlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
//初始化數據發送結束標志
m_bSendEnd=FALSE;
//初始化數據接收結束標志
m_bRecEnd=FALSE;
//更新對話框數據
UpdateData(TRUE);
//打開文件對話框
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWR99vEPROMPT,
"所有文件 (*.*)|*.*||");
if(dlg.DoModal()==IDOK)
{
m_strFileName=dlg.GetPathName();
//開始發送數據線程
AfxBeginThread(SendDataThread,this,THREAD_PRIOR99vY_NORMAL);
}
}
//接收數據按鈕消息響應函數
void CTzg004Dlg::OnButtonReceive()
{
// TODO: Add your control notification handler code here
//初始化數據發送結束標志
m_bSendEnd=FALSE;
//初始化數據接收結束標志
m_bRecEnd=FALSE;
UpdateData(TRUE);
//開始接收數據線程
AfxBeginThread(ReceiveDataThread,this,THREAD_PRIOR99vY_NORMAL);
}
//終止發送按鈕消息響應
void CTzg004Dlg::OnButtonSendEnd()
{
// TODO: Add your control notification handler code here
//設置發送數據結束標志
m_bSendEnd=TRUE;
}
//終止接收按鈕消息響應
void CTzg004Dlg::OnButtonRecEnd()
{
// TODO: Add your control notification handler code here
//設置接收數據結束標志
m_bRecEnd=TRUE;
}
UINT SendDataThread(LPVOID lpParam)
{
CTzg004Dlg *pDlg=(CTzg004Dlg *)lpParam;
CFile file;
if( !file.Open(pDlg->m_strFileName, CFile::modeRead) )
{
AfxMessageBox("打開文件出錯!");
return 0;
}
CSocket sockTemp;
CString str,str1;
sockTemp.Create(pDlg->m_iDataPort1); //得到端口號
sockTemp.Listen(1);//只接受一個連接
CSocket sockSend;
//設置發送按鈕禁止
pDlg->GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);
sockTemp.Accept(sockSend);//注意,sockTemp已交了自己的指針地址到sockSend,故不用Close
//打開發送終止按鈕
pDlg->GetDlgItem(IDC_BUTTON_SEND_END)->EnableWindow(TRUE);
int iBufSize = 1024 * 5;
int iSize = iBufSize;
LPBYTE pBuf = new BYTE[iBufSize];
DWORD dwTemp = 0;
BOOL bTest = sockSend.AsyncSelect(0);//由于CSocket實際是異步,將它變為同步(阻塞)方式。
sockSend.IOCtl( FIONBIO, &dwTemp);//用IOCtl要將AsyncSelect的第一個參數為0,參看MSDN
UINT uiLength = file.GetLength();
sockSend.Send(&uiLength, 4);//傳送文件大小到接收方(Client端)
int iNumByte;
UINT uiTotal = 0;
while(uiTotal < uiLength)
{
int iEnd=pDlg->m_bSendEnd;
//傳送發送端狀態(是否結束)
iNumByte = sockSend.Send(&iEnd, sizeof(int));
//發送錯誤
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("發送錯誤!");
goto ExitLable1;
}else if(iEnd==1)//發送端終止
{
AfxMessageBox("發送端終止");
goto ExitLable1;
}
//讀取文件內容
if((int)(uiLength - uiTotal) < iBufSize)
iSize = uiLength - uiTotal;//當小于緩沖區iTEST時的處理
iSize=file.Read(pBuf , iSize);//得到讀取的字節數
int iCount=0;
//發送定長文件數據
while(iCount<iSize)
{
iNumByte = sockSend.Send(pBuf, iSize-iCount);//注意iNumByte為實際的發送字節數,不要以iSize為準
if(iNumByte == SOCKET_ERROR)
{
AfxMessageBox("發送錯誤!");
goto ExitLable1;
}
iCount+=iNumByte;
if(iCount<iSize)
{
file.Seek(iSize-iCount,CFile::current);
}
}
uiTotal += iCount;
//設置發送數據進度條
pDlg->m_CtrlProgressSend.SetPos(int(((double)uiTotal/uiLength)*100));
str.Format("發送進度:%d%%",int(((double)uiTotal/uiLength)*100));
//表明發送數據百分比
pDlg->GetDlgItem(IDC_STATIC_SEND)->GetWindowText(str1);
if(str1!=str)
pDlg->GetDlgItem(IDC_STATIC_SEND)->SetWindowText(str);
}
//發送文件成功
AfxMessageBox("發送文件成功!");
ExitLable1:
delete[] pBuf;
file.Close();
sockSend.Close();
pDlg->m_CtrlProgressSend.SetPos(0);//恢復進度
pDlg->GetDlgItem(IDC_BUTTON_SEND_END)->EnableWindow(FALSE);//設置發送結束按鈕禁止
pDlg->GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE);//設置發送按鈕正常
pDlg->GetDlgItem(IDC_STATIC_SEND)->SetWindowText("發送進度:"); //恢復提示進度
return 0;
}
UINT ReceiveDataThread(LPVOID lpParam)
{
CTzg004Dlg *pDlg=(CTzg004Dlg *)lpParam;
//保存文件對話框
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWR99vEPROMPT,
"所有文件 (*.*)|*.*||");
while(dlg.DoModal()!=IDOK)
{
AfxMessageBox("選擇文件出錯,請重新選擇!");
}
CString str,str1,str2;
CSocket sockRecv;
sockRecv.Create();
pDlg->m_CtrlIPSend.GetWindowText(str);//得到發送端IP地址
pDlg->GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow(FALSE);//禁止接收按鈕
while(sockRecv.Connect(str,pDlg->m_iDataPort2)==0)//連接發送方地址,若上網,可改為實際IP地址,端口要跟Server端相同。
{
Sleep(50);
}
pDlg->GetDlgItem(IDC_BUTTON_REC_END)->EnableWindow(TRUE);//打開終止接收按鈕
str2=dlg.GetPathName();//得到文件名
CFile file;
file.Open(str2, CFile::modeCreate | CFile::modeWrite);
BOOL bFileFail=FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -