设为首页 加入收藏

TOP

使用TCP协议实现文件传输(三)
2013-05-14 09:22:41 来源: 作者: 【 】 浏览:592
Tags:使用 TCP 协议 实现 文件 传输


    CCSDef::TMSG_FILENAME* pRequestFilenameMsg = (CCSDef::TMSG_FILENAME*)pMsgHeader;
    printf("File Name: %s\n", pRequestFilenameMsg->szFileName);
    // 把文件的路径设置为D盘根目录下
    strcpy(g_szFileName, "D:\\");
    strcat(g_szFileName, "test2.B_imp");
    //strcat(g_szFileName, pRequestFilenameMsg->szFileName);
    // 查找相同文件名的文件是否已经存在,如果存在报错退出
    FILE* pFile;
    if ((pFile = fopen(g_szFileName, "r")) != NULL)
    {
    // 文件已经存在,要求重新输入一个文件
    printf("The file already exist!\n");
    CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_FILEALREADYEXIT_ERROR);
    ::send(g_sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0);
    fclose(pFile);
    return false;
    }
    // 分配缓冲区开始接收文件,如果分配成功就给server端发送开始传送文件的要求
    g_pBuff = new char[g_lLength + 1];
    if (g_pBuff != NULL)
    {
    memset(g_pBuff, '\0', g_lLength + 1);
    printf("Now ready to get the file %s!\n", pRequestFilenameMsg->szFileName);
    CCSDef::TMSG_CLIENT_READY tMsgClientReady;
    if (::send(g_sClient, (char*)(&tMsgClientReady), sizeof(CCSDef::TMSG_CLIENT_READY), 0) == SOCKET_ERROR)
    {
    printf("Send Error!\n");
    exit(-1);
    }
    }
    else
    {
    printf("Alloc memory for file error!\n");
    exit(-1);
    }
    return true;
    }
    // 写入文件
    bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader)
    {
    assert(pMsgHeader != NULL);
    CCSDef::TMSG_FILE* pMsgFile = (CCSDef::TMSG_FILE*)pMsgHeader;
    int nStart = pMsgFile->tFile.nStart;
    int nSize = pMsgFile->tFile.nSize;
    memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
    if (nStart == 0)
    {
    printf("Saving file into buffer…\n");
    }
    memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
    // 如果已经保存到缓冲区完毕就写入文件
    if (nStart + nSize >= g_lLength)
    {
    printf("Writing to disk…\n");
    // 写入文件
    FILE* pFile;
    pFile = fopen(g_szFileName, "w+b");
    fwrite(g_pBuff, sizeof(char), g_lLength, pFile);
    delete [] g_pBuff;
    g_pBuff = NULL;
    fclose(pFile);
    // 保存文件成功传送消息给server退出server
    CCSDef::TMSG_SENDFILESUCCESS tMsgSendFileSuccess;
    while (::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0) == SOCKET_ERROR)
    {
    }
    printf("Save the file %s success!\n", g_szFileName);
    return true;
    }
    else
    {
    return false;
    }
    }
    // 处理server端传送过来的消息
    bool ProcessMsg()
    {
    CCSDef::TMSG_HEADER *pMsgHeader;
    int nRecv = ::recv(g_sClient, g_szBuff, MAX_PACKET_SIZE + 1, 0);
    pMsgHeader = (CCSDef::TMSG_HEADER*)g_szBuff;
    switch (pMsgHeader->cMsgID)
    {
    case MSG_OPENFILE_ERROR:   // 打开文件错误
    {
    OpenFileError(pMsgHeader);
    }
    break;
    case MSG_FILELENGTH:    // 文件的长度
    {
    if (g_lLength == 0)
    {
    g_lLength = ((CCSDef::TMSG_FILELENGTH*)pMsgHeader)->lLength;
    printf("File Length: %d\n", g_lLength);
    }
    }
    break;
    case MSG_FILENAME:     // 文件名
    {
    return AllocateMemoryForFile(pMsgHeader);
    }
    break;
    case MSG_FILE:      // 传送文件,写入文件成功之后退出这个函数
    {
    if (WriteToFile(pMsgHeader))
    {
    /*Sleep(1000);*/
    return false;
    }
    }
    break;
    }
    return true;
    }

          

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇找出最小元素A与B的联盟 下一篇set和multiset的内部结构

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: