+ -
当前位置:首页 → 问答吧 → 关于tcp收发不同文件的代码问题?

关于tcp收发不同文件的代码问题?

时间:2011-12-06

来源:互联网

发送端
C/C++ code
while(1)
    {        
        //文件操作
        static int num=1;
        CString strPathName;
        strPathName.Format("D:\\testclient\\test%d.txt",num++);

        
        CFile file;
        if(!file.Open(strPathName, CFile::modeRead | CFile::typeBinary))
        {
            AfxMessageBox("打开文件失败");
            return -1;
        }
        char temp[1024];                            //首先用来存放文件大小,后面用作发送文件缓冲区
        memset(temp,0,sizeof(temp)); 
        /////////////////////////发送文件///////////////////////////////////////////
        int  iEnd =0;
        int  ilen =0;
        
        while (1)
        {
            ilen = file.Read(temp, 1024);        //文件分片大小
            iEnd = send(pDlg->m_hSocket,temp,ilen,0);        //发送文件数据大小
            if (iEnd==SOCKET_ERROR)
            {
                strError.Format("Send File:%d",error=WSAGetLastError());
                AfxMessageBox(strError);
                break;
            }
            if (ilen==0)                        //如果文件分片为0
            {
                break;
            }
    
        }
        file.Close();
        
    }

接收端
C/C++ code
While(1)
{

    。。。。。。。。。。。。。。。。。。。。。略(和发送端类似)
    while (1)
    {
        rcv = recv(s, buffer, 1024, 0);
        file.Write(buffer,rcv);
        if (rcv <= 0)
        {
            break;
        }
        
    }
    file.Close();
}

我的想法是,发送端发送不同的文件,接收端也定义不同的文件接收。
但发现代码
C/C++ code
if (rcv <= 0)
{
    break;
}

始终不执行,网上查了下,貌似tcp不会接收到为0 的数据,所以造成接收端就用一个文件接收了所有的数据,请问,如果按我的想法,如上代码该如何修改。

作者: shn521   发布时间: 2011-12-06

需要在一个文件发送完之后再发送一些特殊的数据标识文件发送完了,接收端收到这些数据之后就知道已经收完一个文件

作者: mayudong1   发布时间: 2011-12-06

因为TCP是流,没有数据边界。

你需要自定义协议,长度+数据,自己判断一个文件是否接收完成

作者: VisualEleven   发布时间: 2011-12-06

自己定义一些文件结束符等来结束接收

作者: oyljerry   发布时间: 2011-12-06