找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: psycheqiqi

传文件的问题

[复制链接]
 楼主| 发表于 2009-9-16 16:53:53 | 显示全部楼层
现在能传过去了,但是有乱码
发送端:
void CAceClientDlg::OnFileSend()
{
        // TODO: Add your control notification handler code here

        CString str;
        sendFile.Abort();
                sendFile.Open(sendFileName,CFile::modeRead );
        sendFileLen = sendFile.GetLength();
        if(sendFileLen<MAX_DATA_BUFF)
                 MessageBox("OK");
        else
        {
                MessageBox("Too Large");
                return ;
        }

        int size=8191;
                int i=0;
        iovec send[100];
        while(sendFileLen>size)
        {
               
        char* membuf= (char*)LocalAlloc(LMEM_FIXED,size+1);
        memset(membuf,0,size+1);
        sendFile.ReadHuge(membuf,size);
        membuf[size]='%';
        send
.iov_base = membuf;
        send
.iov_len = size+1;
        i++;
        sendFileLen -= size;
        LocalFree(membuf);
        }
        char* membuf= (char*)LocalAlloc(LMEM_FIXED,sendFileLen+1);
        memset(membuf,0,sendFileLen+1);
        sendFile.ReadHuge(membuf,sendFileLen);
        membuf[sendFileLen]='%';
        send
.iov_base = membuf;
        send
.iov_len = sendFileLen+1;
        i++;
        pc->peer().send(send,i);
        LocalFree(membuf);
}
接受端:
        const size_t INPUT_SIZE =1000*1000;//INPUT_SIZE的值可以修改,具体多大不会出错待定
//        char  buffer[INPUT_SIZE];
    char *buffer;

        DWORD recv_cnt,send_cnt;
        iovec response;
  

        const int MAXHOSTNAMELEN=32;
        ACE_TCHAR peer_name[MAXHOSTNAMELEN];
        ACE_INET_Addr peer_addr;
        

        CString str;

        CAceTestDlg *dlg=(CAceTestDlg*)AfxGetApp()->GetMainWnd();

         this->sock_.get_remote_addr(peer_addr);
     peer_addr.addr_to_string(peer_name,MAXHOSTNAMELEN);
     recv_cnt = this->sock_.recvv(&response);
         buffer = response.iov_base ;
//         recv_cnt = this->sock_.recv(buffer,sizeof(buffer));
        if(recv_cnt <=0 )
        {
                ACE_DEBUG((LM_DEBUG,
                        ACE_TEXT("%s Connection closed\n"),peer_name));
                num--;
                str.Format("%s Connection closed\n",peer_name);
                m_lbx->AddString(str);
                return -1;
        }

  if( buffer[recv_cnt-1] == '@')
  {        //文字信息
          buffer[recv_cnt-1] = '\0';
          str.Format("%s send : ",peer_name);
          str += buffer;
          m_lbx->AddString(str);
          return 0;
  }
  if( buffer[recv_cnt-1] == '$')
  {        //文件名
          buffer[recv_cnt-1] = '\0';
         

           recvFileName = buffer;
           dlg->MessageBox(recvFileName);
          return 0;

  }
if(  buffer[recv_cnt-1] =='%')
{ //文件内容
           buffer[recv_cnt-1] = '\0';
           str.Format("%d",recv_cnt-1);
          dlg->MessageBox(str);

           if (dlg->MessageBox("是否接收数据?","提示",MB_YESNO)==IDYES)
           {
                  /* CString returnPath;
                   TCHAR szPath[MAX_PATH];
                   BROWSEINFO bInfo;
                   bInfo.hwndOwner = NULL;
                   bInfo.pidlRoot  = NULL;
                   bInfo.pszDisplayName = szPath;
                   bInfo.lpszTitle ="请选择目的路径";
                   bInfo.ulFlags = BIF_BROWSEINCLUDEFILES|BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS|BIF_BROWSEFORCOMPUTER;
                   bInfo.lParam  =NULL;
                   bInfo.lpfn  =NULL;

                   LPITEMIDLIST lpList =  SHBrowseForFolder(&bInfo);
                   SHGetPathFromIDList(lpList,szPath);
               
         CString filePath = szPath ;
                 filePath += "\\";
//用来区分哪个客户端发来的文件,把其IP地址放在文件名的前一级目录。
//                 filePath += peer_name
//                  filePath += "\\";
                 filePath += recvFileName;
                 */
                  CString filePath = "E://" + recvFileName;
         dlg->MessageBox(filePath);
             //往文件里写内容
              //保存文件对话框的问题
             if (file_connector.connect(file,
                 ACE_FILE_Addr (filePath),
                  0,
                  ACE_Addr::sap_any,
                  0,
                  O_RDWR|O_CREAT|O_APPEND
                  ) == -1)
          {
                  printf("error");
          }
          int len=recv_cnt-1;
          if (file.send (buffer, len) != len)
                  ACE_ERROR_RETURN ((LM_ERROR,
                  "%p\n",
                  "send"),
                  1);
//所传文件的信息            
         
          if (file.close () == -1)
                  ACE_ERROR_RETURN ((LM_ERROR,
                  "%p\n",
                  "close"),
                  1);
          dlg->MessageBox("传送完毕");

           }
                return 0;
}
    LocalFree(buffer);
        return 0;


}
 楼主| 发表于 2009-9-16 17:20:39 | 显示全部楼层

回复 #11 psycheqiqi 的帖子

为什么会有很少量的乱码

而且利用最大的缓冲为8192有点投机取巧的意思。
有没有别的方法?
发表于 2009-9-16 17:24:47 | 显示全部楼层
原帖由 psycheqiqi 于 2009-9-16 16:05 发表
我试了下,最多一次传8192个字节。我想传更多怎么设置?
能修改缓冲区的大小吗?或者其它方法?

我想楼主遇到的问题不是ACE的使用的问题,
关于楼主提的问题,我想在一些网络编程的基础书籍上应该可以找到很好的答案。

可以选择参考windows 网络编程的第九章。
或者unix网络编程第七章。
发表于 2009-9-16 17:27:32 | 显示全部楼层
遇到问题有思考是好事,
不过多看书多学习累积基础知识是必不可少的过程、
 楼主| 发表于 2009-9-16 17:30:20 | 显示全部楼层

回复 #13 modern 的帖子

卷1还是卷2?。。。
 楼主| 发表于 2009-9-16 17:32:37 | 显示全部楼层

回复 #15 psycheqiqi 的帖子

搞错了,以为C++。字数
 楼主| 发表于 2009-9-17 09:03:47 | 显示全部楼层

回复 #16 psycheqiqi 的帖子

我用iovec把数据分成多个缓冲区来传收信息,但数据很大时为什么在数据的分段的地方有少量的乱码?
 楼主| 发表于 2009-9-17 09:36:01 | 显示全部楼层

回复 #17 psycheqiqi 的帖子

解决了大文本的发送

我把文本分成段,直接发就行,不用iovec,简单问题复杂化了。:D
 楼主| 发表于 2009-9-17 10:29:34 | 显示全部楼层

回复 #18 psycheqiqi 的帖子

已经搞定了。
好像因为一个localalloc的问题,改完再研究,还是自己写代码比较好。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 00:27 , Processed in 0.015462 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表