Socket传输文件示例(下)

原创 2003年11月18日 10:01:00

UINT ReceiveDataThread(LPVOID lpParam)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

{

         CTzg004Dlg *pDlg=(CTzg004Dlg *)lpParam;

         //保存文件对话框

         CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

                   "所有文件 (*.*)|*.*||");

         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;

         DWORD dwTemp =  0;

         sockRecv.AsyncSelect(0);

         sockRecv.IOCtl( FIONBIO, &dwTemp);//变为阻塞方式

        

         UINT uiLength;

         sockRecv.Receive(&uiLength, 4);//接收发方(Server端)的文件大小

         int  iBufSize = 1024  * 5;

         int  iSize = iBufSize;

         LPBYTE  pBuf = new BYTE[iBufSize];

         int  iNumByte;

         UINT uiTotal = 0;

         while(uiTotal < uiLength)

         {

                   int iEnd=0;

                   //接收端终止

                  if(pDlg->m_bRecEnd)

                   {

                            AfxMessageBox("接收端终止!");

                            goto ExitLable2;

                   }

                   //接收发送端状态数据

                  iNumByte=sockRecv.Receive(&iEnd, sizeof(int));

                  if(iNumByte == SOCKET_ERROR)

                   {

                            AfxMessageBox("接收信号错误!");

                            goto ExitLable2;

                   }

                   //发送端终止

                  if(iEnd==1)

                   {

                            AfxMessageBox("发送端终止!");

                            goto ExitLable2;

                   }

 

                  if((int)(uiLength - uiTotal) < iBufSize)

                            iSize = uiLength - uiTotal;

                   int iCount=0;

                   //读取定长数据

                  while(iCount<iSize)

                   {

                            iNumByte = sockRecv.Receive(pBuf, iSize-iCount);

                            if(iNumByte == SOCKET_ERROR)

                            {

                                     AfxMessageBox("接收错误!");

                                     goto ExitLable2;

                            }

                            iCount+=iNumByte;

                            file.Write(pBuf, iNumByte);

                   }

                   uiTotal += iCount;//以实际接收字节为准

                   //设置接收进度

                  pDlg->m_CtrlProgressRec.SetPos(int(((double)uiTotal/uiLength)*100));

                  str.Format("接收进度:%d%%",int(((double)uiTotal/uiLength)*100));

                   //显示接收进度百分比

                  pDlg->GetDlgItem(IDC_STATIC_REC)->GetWindowText(str1);

                  if(str1!=str)

                            pDlg->GetDlgItem(IDC_STATIC_REC)->SetWindowText(str);

         }

         //接收文件成功

         AfxMessageBox("接收文件成功!");

         bFileFail=TRUE;

ExitLable2:

         delete[] pBuf;

         file.Close();

         //文件接收失败,则删除接收文件

         if(!bFileFail)

         {

                  CFile::Remove( str2 );

         }

         sockRecv.Close();

         pDlg->m_CtrlProgressRec.SetPos(0);//恢复接收进度

         //禁止终止接收按钮

         pDlg->GetDlgItem(IDC_BUTTON_REC_END)->EnableWindow(FALSE);

         //打开接收按钮

         pDlg->GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow(TRUE);

         //恢复提示进度

         pDlg->GetDlgItem(IDC_STATIC_REC)->SetWindowText("接收进度:");

         return 0;

}

 

android--Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解。在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加...
  • xuexiiphone
  • xuexiiphone
  • 2016年04月26日 18:10
  • 1725

socket文件传输示例

Server端代码: /*************************************************************************    > File Na...
  • xipiaoyouzi
  • xipiaoyouzi
  • 2015年02月06日 11:05
  • 1012

Java Socket实现文件传输

最近学Socket学上瘾了,就写了一个简单的文件传输程序。 客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端。传输的...
  • huang930528
  • huang930528
  • 2016年09月01日 17:00
  • 6825

通过Socket连接一次传输多个文件

最近在做一个通过WIFI在手机之间传输文件的功能。需要在手机之间建立一个持久的Socket连接并利用该连接传输数据。可以一次传输一个或多个文件。 在一次传输多个文件时,遇到了一个困难:如何在接收文件...
  • fx1ts
  • fx1ts
  • 2014年08月20日 10:33
  • 1942

socket网络传输大文件

1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream...
  • qq_36946260
  • qq_36946260
  • 2017年04月05日 11:54
  • 714

Linux下socket传输文件示例

为了方便获取在嵌入式设备中生成的文件,可以在嵌入式端建立一个文件服务器 /*server.c*/ #include #include #include #include #inclu...
  • CodeHeng
  • CodeHeng
  • 2015年01月16日 10:05
  • 359

利用Socket进行大文件传输

最近接触到利用socket进行大文件传输的技术,有些心得,与大家分享.首先看看这个过程是怎么进行的(如下图):      所以,我们需要三个socket在窗体加载的时候初始化: 1....
  • u014538198
  • u014538198
  • 2014年12月08日 16:17
  • 1199

linux socket 传输大文件解决方案

linux 下socket 大文件传输解决方案 附带源码 支持大文件
  • zhqianpeng
  • zhqianpeng
  • 2015年06月14日 11:08
  • 410

C++利用socket的客户端和服务器之间传输文件

//服务器的代码文件有 /* message.h source.h source.cpp server.h server.cpp */ //客户端的代码文件有 /* message.h 和服务器端...
  • riyuedangkong1
  • riyuedangkong1
  • 2016年10月05日 17:38
  • 7653

\(^_^)/ Java 使用Socket多线程传输整个文件夹

一.列出莫文件夹中所有的文件和文件夹的工具类,磁盘列表类   Java代码   package upload;      import java.io.File;  ...
  • u014538198
  • u014538198
  • 2014年12月04日 19:02
  • 448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Socket传输文件示例(下)
举报原因:
原因补充:

(最多只允许输入30个字)