涓涓猄ocket浼犺緭鏂囦欢鐨勪緥瀛
鍙戝竷: 2008-6-26 12:23 | 浣滆: admin | 鏌ョ湅: 86娆
鏃堕棿闂锛屽湪杞浇杩欎釜浠g爜鍓嶏紝娌℃湁缁忚繃娴嬭瘯锛屽ぇ瀹惰嚜宸辨祴璇曚竴涓嬶紝濡傛灉鏈変粈涔堥棶棰橈紝鍐嶈窡鎴戜滑鑱旂郴銆
//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);//娉ㄦ剰锛宻ockTemp宸蹭氦浜嗚嚜宸辩殑鎸囬拡鍦板潃鍒皊ockSend锛屾晠涓嶇敤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);//鐢↖OCtl瑕佸皢AsyncSelect鐨勭涓涓弬鏁颁负0锛屽弬鐪婱SDN
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 { iNumByte = sockSend.Send(pBuf, iSize-iCount);//娉ㄦ剰iNumByte涓哄疄闄呯殑鍙戦佸瓧鑺傛暟锛屼笉瑕佷互iSize涓哄噯 if(iNumByte == SOCKET_ERROR) { AfxMessageBox("鍙戦侀敊璇紒"); goto ExitLable1; } iCount+=iNumByte; if(iCount { 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鍦板潃锛岀鍙h璺烻erver绔浉鍚屻 { 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;




发表于 2009-1-5 19:48
| 











