same

解决方案 »

  1.   

    补充一下,我的意思是在传文件的同时,也能传消息
    tcp 方式,WSAansyselect i/o 模型,C/S都是这样
    M-我将循环发送消息的数据前加上了‘M’每条都加
    F-我将循环发送文件前加上了‘F’每条都加
    接受时我判断数据是否有‘M’和‘F’,做响应的判断,然后处理
    但是,发文件时有问题,
    先删除数据前的‘F’字符,然后处理  问题是文件不正常,文件格式修改了,有问题
      

  2.   

    首先不明白为什么要发消息,消息不是FD_XXX吗?
    文件问题,我估计是文件分割时的问题
      

  3.   

    bool CSocket_sdk_sDlg::RevData()
    {
    char        bufx[1024]={0};
    char        buf[1024]={0};
    CString     string;
    int         n=0;
    int         ret=0;
    CString     szTextNow;
    n=recv(sclientRev,bufx,1024,0); //接受
    if(n==SOCKET_ERROR)
    {
    AfxMessageBox("error");
    return false;
    }
    string.Format("%s",bufx);
    if (string.Mid(0,1)=="M")
    {
    string.Delete(0,1);
    GetDlgItem(IDC_EDIT2)->GetWindowText(szTextNow);
    szTextNow+=string;
    GetDlgItem(IDC_EDIT2)->SetWindowText(szTextNow);
    }
    else if (string.Mid(0,1)=="F")
    {
    if (nRecIndex==0)
    {
    GetDlgItem(IDC_BUTTON3)->EnableWindow(false);
    string.Delete(0,1);
    m_szFilename=string;
    }
    else if (nRecIndex==1)
    {
    string.Delete(0,1);
    m_szFileSize=string;
    m_proess.SetRange32(0,atol(m_szFileSize));
    }
    else
    {
    string.Delete(0,1);
    strcpy(buf,string);
    file.Write(buf,n);
    }
    nNum+=n;
    m_proess.SetPos(nNum);
    nRecIndex++;
    if (m_proess.GetPos()==atol(m_szFileSize))
    {
    GetDlgItem(IDC_BUTTON3)->EnableWindow(true);
    GetDlgItem(IDC_revflag)->SetWindowText("文件传输成功!");
    }
    }
    return true;
    }
      

  4.   

    数据和文件的接收,都是FD_READ消息触发后循环的触发(因为发送是循环的发送).调用上面的函数
      

  5.   

    bufx
    这个接收数组,在recv前,先用ZeroMemory()清空
      

  6.   

    string.Delete(0,1);
    strcpy(buf,string);
    file.Write(buf,n);1.你收到了n个字节数据,你自己去掉了前面的'F',居然还往文件里写n个字节,不是每条都增加了一个字节?
    2.字符串的存放,最后会以'\0'结尾,是否把'\0'也写进文件去了,这样每条又增加一个字节.因此,如果你个二进制文件传输过来,被你插入了无数字节,文件格式还对才怪!
    你检查一下,传输过来的数据组成的文件是否比原来文件大了很多?
    如果是大了,就是以上原因