大家来看看我写的这段程序,关于socket传输文件的问题

原创 2007年10月04日 04:37:00

发送端程序: 

UINT SendProc( LPVOID pParam )
{
 CMyClientDlg *MyDlg=(CMyClientDlg *)pParam;
 
 CFile file;
 CString Str;
 MyDlg->GetDlgItemText(IDC_EDIT1,Str);
 if(!file.Open(Str,CFile::modeRead | CFile::typeBinary))
 {
  AfxMessageBox("Can not open the Specifying file!");
 }
 CWnd *pWnd=(CStatic *)(MyDlg->GetDlgItem(IDC_FILESIZE));
 CString len;
 len.Format("%d Bytes",file.GetLength());
 pWnd->SetWindowText(len);

 char Buffer[4096];
 memset(Buffer,0,sizeof(Buffer));

 SOCKADDR_IN addr;
 addr.sin_family=AF_INET;
 addr.sin_port=htons(8099);
 addr.sin_addr.S_un.S_addr=inet_addr("10.0.1.10");

 int nRead;
 int nTotalFileLength=file.GetLength();
 int nTotalLeftLength=nTotalFileLength;
 connect(MyDlg->m_sock,(SOCKADDR *)&addr,sizeof(SOCKADDR));
 int nleftlength=0;
 char FileLen[10];
 CString StrTransfer;
 CWnd *pS=(CStatic *)(MyDlg->GetDlgItem(IDC_FINISH));
 sprintf(FileLen,"%d",nTotalFileLength);
 send(MyDlg->m_sock,FileLen,10,0);

 MyDlg->hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
 char receive[4];
 int nRecv=recv(MyDlg->m_sock,receive,4,0);
 if(nRecv)
  SetEvent(MyDlg->hEvent);
 WaitForSingleObject(MyDlg->hEvent,INFINITE);
 do{
  nRead=file.Read(Buffer,sizeof(Buffer));
  nleftlength=send(MyDlg->m_sock,Buffer,strlen(Buffer)+1,0);
  StrTransfer.Format("Has Transfer %d Bytes",nleftlength);
  memset(Buffer,0,sizeof(Buffer));
  pS->SetWindowText(StrTransfer);
  nTotalLeftLength-=nRead;
 }
  while(nTotalLeftLength>0);
 
  closesocket(MyDlg->m_sock);
  return 1;
}

 

接受端:void CMyServerDlg::OnBtnStartup()
{
 // TODO: Add your control notification handler code here
 CString StrError;
 m_sock=socket(AF_INET,SOCK_STREAM,0);
 SOCKADDR_IN addr;
 addr.sin_family=AF_INET;
 addr.sin_port=htons(8099);
 addr.sin_addr.S_un.S_addr=INADDR_ANY;
 int nbind=bind(m_sock,(SOCKADDR *)&addr,sizeof(SOCKADDR));
 if(nbind==SOCKET_ERROR)
 {
  StrError.Format("%d",WSAGetLastError());
  AfxMessageBox(StrError);
 }
 int nlisten=listen(m_sock,5);
 if(nlisten==SOCKET_ERROR)
 {
  StrError.Format("%d",WSAGetLastError());
  AfxMessageBox(StrError);
 }

 SOCKADDR_IN addrfrom;
 int nLen=sizeof(SOCKADDR_IN);
 SOCKET sockfrom=accept(m_sock,(SOCKADDR *)&addrfrom,(int *)&nLen);
 if(sockfrom==INVALID_SOCKET)
 {
  StrError.Format("%d",WSAGetLastError());
  AfxMessageBox(inet_ntoa(addrfrom.sin_addr)+StrError);
 }
 CString StrErr;
 
 char FileLen[10];
 memset(FileLen,0,10);
 int nrecv=recv(sockfrom,FileLen,10,0);
 if(nrecv==SOCKET_ERROR)
 {
  StrErr.Format("Recv Error %d",WSAGetLastError());
  AfxMessageBox(StrErr);
 }
 send(sockfrom,"yes",4,0);
 int nFileLength=0;
 nFileLength=atoi(FileLen);
 char Buffer[4096];
 memset(Buffer,0,sizeof(Buffer));

 int nLeftLength=nFileLength;
 int nRecv;
 CString StrTransfer;
 CWnd *pS=(CStatic *)GetDlgItem(IDC_FINISH);

 CFileDialog Dlg(FALSE);
 if(Dlg.DoModal()==IDOK)
 {
  CFile file(Dlg.GetPathName(),CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
  do
  {
   nRecv=recv(sockfrom,Buffer,sizeof(Buffer),0);
   if(nRecv==SOCKET_ERROR)
    AfxMessageBox("failed");
   file.Write(Buffer,nRecv);
   StrTransfer.Format("Has Transfer %d Bytes",nRecv);
   pS->SetWindowText(StrTransfer);
   nLeftLength=nLeftLength-nRecv;
   memset(Buffer,0,sizeof(Buffer));

  } while(nLeftLength>0);
  file.Close();
  closesocket(sockfrom);
 }
 }

接收文件有问题,只能正常接收.txt文件,其他的都有问题,我知道是算法不对,可我不知道该怎么改。大家一起看一看怎么样,顺便也学习一下?

我的邮箱 350109815@163.com

关于socket的几个问题

主要说的是几个转换函数 网络字节与本地字节的相互转化二进制ip与十进制ip的转换ip地址与主机名的转化 1.socket类型 socket:linux中的网络编程是用socket接口...
  • zzyoucan
  • zzyoucan
  • 2013年06月25日 19:35
  • 1481

利用socket实现简单的文件传输小程序

1. 前言最近老板突然说, 需要在原先的相机系统上面添加一个文件传输的模块, 不让用现成的软件如filezilla, 没办法只能自己手写一个2. 实现效果3. 基本思想 本质上, 文件传输就是从一个地...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年08月11日 12:08
  • 2709

socket应用(一)如何利用C语言写文件传输的程序

在网上搜了很久,也没有找到很具体和实用的发送文件的C源程序,于是就自己研究了半天,编写了个可以无差错传文件的程序,拿出来晒晒,以下中括号里的就是调用的函数,具体源文件我放到资源里了,大家可以去下载ht...
  • zhwfnh
  • zhwfnh
  • 2010年04月18日 23:12
  • 7294

Windows用socket实现文件传输

这里只写客户端代码。编译前请加上libws2_32.a链接库,不然会导致链接失败。 客户端: #include #include #pragma comment(lib,"ws2_32.lib")...
  • e_one
  • e_one
  • 2016年05月14日 17:04
  • 14543

再造 “手机QQ” 侧滑菜单(三)——视图联动

代码示例:https://github.com/johnlui/SwiftSideslipLikeQQ 本文中,我们将一起使用 UINavigationController 来管理主视图,并...
  • shudian
  • shudian
  • 2015年04月15日 11:20
  • 354

大家有时间的话来看看我的相册

~大家有时间的话来看看我的相册~
  • bhwshx
  • bhwshx
  • 2009年03月09日 09:33
  • 457

windows 下实现socket编程_传送文件

windows 下实现socket编程_传送文件 其实,Windows下的socket编程与Linux下的类似,这里不再赘述! 参考:http://blog.csdn.net/chudon...
  • chudongfang2015
  • chudongfang2015
  • 2016年07月27日 21:47
  • 685

linux socket 传输大文件解决方案

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

Java Socket实现文件传输示例代码

这篇文章主要介绍了Java Socket实现文件传输示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 最近学Socket学上瘾了,就写了一个简单的文件传输...
  • maguanghui_2012
  • maguanghui_2012
  • 2017年02月07日 14:00
  • 1981

socket实现文件传输功能

要实现的功能为:client 从 server 下载一个文件并保存到本地。 编写这个程序需要注意两个问题: 1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不...
  • yimingsilence
  • yimingsilence
  • 2017年06月03日 21:12
  • 1760
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大家来看看我写的这段程序,关于socket传输文件的问题
举报原因:
原因补充:

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