想实现多播组中发送一个Excel文件和一个标准为用来确定多播组中的哪一个成员应该接受这个Excel。只发送简单的信息的多播程序可以实现,但发送一个完整Excel(大小有几百KB)该如何实现,还望各位高手指点一下,实现的思路是什么,主要是如何读取这个选定的Excel文件并发送,接收端如何接受这个发送过来的数据。谢谢大家了。

解决方案 »

  1.   

    按二进制读取并发送,这有组播的例子SntpClnt:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  2.   

    我的发送函数如下:{
    CFileDialog filedlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"Worksheet Files (*.xls)|*.xls|All Files (*.*)|*.*||",NULL);
        filedlg.m_ofn.lpstrTitle="选择导入文件清单";//弹出的对话框的标题
    CString sFile;
    TCHAR szFilePath[MAX_PATH+1];
    GetModuleFileName(NULL,szFilePath,MAX_PATH);
    (_tcsrchr(szFilePath,_T('\\')))[1]=0;
    sFile=szFilePath;
    sFile=sFile+"分支连接关系表.txt";
        filedlg.m_ofn.lpstrInitialDir=sFile;
    if(filedlg.DoModal()==IDOK)
    {

    CString filename;
    filename=filedlg.GetPathName();
    CFile file(filename,CFile::modeRead|CFile::shareDenyWrite);
    byte *buffer=NULL;
    long count=file.GetLength();//得到文件以字节为单位的大小
    buffer= new byte[count];//申请内存区域用于读取的文件内容的存放
    file.Read(buffer,count);//读取文件中的内容

    int nReturnCode = sendto(m_hGroupSocket, (char*)&buffer,count, 0, 
    (sockaddr*)&srcaddr, sizeof(sockaddr));
       if(nReturnCode == SOCKET_ERROR){
    AfxMessageBox("Error in send packets to the network!\n");
    return ;
       } 
           file.Close();//发送问文件以后关闭文件

    }

    }
    接收函数如下:
            byte *buffer=NULL;
    buffer= new byte[1024*3];
    int nAddrLen=sizeof(From);
    int nRet=recvfrom(m_hGroupSocket,(char*)&buffer, 1024*3,0,(sockaddr*)&From,&nAddrLen);
    CFile m_file;
    CString tt=_T("D:\\连接关系表.txt");
    if(m_file.Open(tt,CFile::modeWrite|CFile::modeCreate)==FALSE)
    {
    AfxMessageBox("Failed to open the file!");
    m_file.Close();
    }
        m_file.Write(buffer,1024);
    m_file.Close();//将接收到的文件写入新文件发送的是1KB的TXT文件,接收缓冲区比发送缓冲区大,可以接收到正确的文件但是会弹出异常 
    First-chance exception in XXX.exe (KERNEL32.DLL): oxcoooooo5 Access Violation
    问题出在接收函数上 因为我把接收函数的recvfrom()注释掉就不会有这个问题 但是不知道该如何解决 请帮忙看一下吧 麻烦您了