设为首页 加入收藏

TOP

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


    printf("Listening To Client…\n");
    //循环接收client端的连接请求
    sockaddr_in ClientAddr;
    int nAddrLen = sizeof(sockaddr_in);
    SOCKET sClient;
    //取队列最前端客户连接请求,创建套接字连接通道
    while((sClient=::accept(sListen,(sockaddr*)&ClientAddr,&nAddrLen))==INVALID_SOCKET)
    {}
    //解析消息并进行相应的处理
    //int count=10;//作为定时当程序执行10s未完成时直接退出
    //while(ProcessMsg(sClient)==true&&count>0)
    //{
    //  Sleep(1000);
    //  count--;
    //}
    while(ProcessMsg(sClient)==true)
    {
    Sleep(1000);
    }
    //关闭同客户端的连接
    ::closesocket(sClient);
    ::closesocket(sListen);
    }
    //打开文件
    bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader,SOCKET sClient)
    {
    CCSDef::TMSG_FILENAME* pRequstFileNameMsg=(CCSDef::TMSG_FILENAME*)pMsgHeader;
    //对文件名进行处理
    char *p1,*p2;
    for(p1=pRequstFileNameMsg->szFileName,p2=g_szNewFileName;*p1!='\0';p1++,p2++)
    {
    if(*p1!='\n')
    {
    *p2=*p1;
    }
    if(*p2=='\\')//将'\'转换为'\\'
    {
    *(++p2)='\\';
    }
    }
    *p2='\0';
    ReadFile(sClient);
    return true;
    }
    //传送文件
    bool SendFile(SOCKET sClient)
    {
    if (NULL == g_pBuff)
    {//如果缓冲区为空
    ReadFile(sClient);
    }
    int nPacketBufferSize = MAX_PACKET_SIZE - 2 * sizeof(int); // 每个数据包存放文件的buffer大小
    // 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送
    for (int i = 0; i < g_lLength; i += nPacketBufferSize)
    {
    CCSDef::TMSG_FILE tMsgFile;
    tMsgFile.tFile.nStart = i;
    if (i + nPacketBufferSize + 1> g_lLength)
    {//文件块已经是最后一块
    tMsgFile.tFile.nSize = g_lLength - i;
    }
    else
    {
    tMsgFile.tFile.nSize = nPacketBufferSize;
    }
    memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);//copy到缓冲区
    ::send(sClient, (char*)(&tMsgFile), sizeof(CCSDef::TMSG_FILE), 0);
    Sleep(0.5);
    }
    delete [] g_pBuff;
    g_pBuff = NULL;
    return true;
    }
    //读取文件进缓冲区
    bool ReadFile(SOCKET sClient)
    {
    if(g_pBuff!=NULL)
    {//如果缓冲区不为空
    return true;
    }
    //打开文件
    FILE *pFile;
    if((pFile = fopen(g_szNewFileName, "rb"))==NULL)
    {//文件打开失败,发送错误报告
    printf("Cannot find the file, request the client input file name again\n");
    CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_OPENFILE_ERROR);
    ::send(sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0);
    return false;
    }
    //传送文件长度到Client
    fseek(pFile,0,SEEK_END);//重定位指针到文件末尾
    g_lLength=ftell(pFile);//返回文件指针相对于文件头的偏移量
    printf("File Length = %d\n", g_lLength);
    CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength);
    ::send(sClient,(char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0);
    // 处理文件全路径名,把文件名分解出来
    //磁盘号,目录,文件名,后缀名
    char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFname[_MAX_FNAME], szExt[_MAX_EXT];
    _splitpath(g_szNewFileName, szDrive, szDir, szFname, szExt);
    strcat(szFname,szExt);
    CCSDef::TMSG_FILENAME tMsgFileName;
    strcpy(tMsgFileName.szFileName, szFname);
    printf("Send File Name: %s\n", tMsgFileName.szFileName);
    ::send(sClient, (char*)(&tMsgFileName), sizeof(CCSDef::TMSG_FILENAME), 0);
    //分配缓冲区,读取文件内容
    g_pBuff = new char[g_lLength + 1];
    if (g_pBuff == NULL)
    {
    return false;
    }
    fseek(pFile, 0, SEEK_SET);
    fread(g_pBuff, sizeof(char), g_lLength, pFile);
    g_pBuff[g_lLength] = '\0';
    fclose(pFile);
    return true;
    }
    【2】客户端:
    头文件同服务器端头文件
    源程序文件:
    [cpp]
    /*Client.cpp*/
    #include"Client.h"
    long g_lLength = 0;
    char* g_pBuff = NULL;
    char g_szFileName[MAXFILEDIRLENGTH];
    char g_szBuff[MAX_PACKET_SIZE+1];
    SOCKET g_sClient;
    // 初始化socket库
    bool InitSocket();
    // 关闭socket库
    bool CloseSocket();
    // 把用户输入的文件路径传送到server端
    bool SendFileNameToServer();
    // 与server端连接
    bool ConectToServer();
    // 打开文件失败
    bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader);
    // 分配空间以便写入文件
    bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader);
    // 写入文件
    bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader);
    // 处理server端传送过来的消息
    bool ProcessMsg();
    int main()
    {
    while(1)
    {
    InitSocket();
    ConectToServer();
    CloseSocket();
    }
    //system("pause");
    return 0;
    }
    // 初始化socket库
    bool InitSocket()
    {
    //初始化SOCKET
    WSADATA wsaData;
    WORD socketVersion=MAKEWORD(2,2);
    if(::WSAStartup(socketVersion,&wsaData)!=0)
    {
    printf("Init socket dll error\n");
    exit(-1);
    }
    return true;
    }
    // 关闭socket库
    bool CloseSocket()
    {
    // 关闭套接字
    ::closesocket(g_sClient);
    // 释放winsock库
    ::WSACleanup();
    return true;
    }
    // 把用户输入的文件路径传送到server端
    bool SendFileNameToServer()
    {
    char szFileName[MAXFILEDIRLENGTH];
    printf("Input the File Directory: ");
    //fgets(szFileName, MAXFILEDIRLENGTH, stdin);
    strcpy(szFileName,"E:\\test1.A_exp");
    // 把文件路径发到server端
    CCSDef::TMSG_FILENAME tMsgRequestFileName;
    strcpy(tMsgRequestFileName.szFileName, szFileName);
    if (::send(g_sClient, (char*)(&tMsgRequestFileName), sizeof(CCSDef::TMSG_FILENAME), 0) == SOCKET_ERROR)
    {
    printf("Send File Name Error!\n");
    exit(-1);
    }
    return true;
    }
    // 与server端连接
    bool ConectToServer()
    {
    // 初始化socket套接字
    if ((g_sClient = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
    {
    printf("Init Socket Error!\n");
    exit(-1);
    }
    sockaddr_in servAddr;
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(PORT);
    servAddr.sin_addr.S_un.S_addr = ::inet_addr(SERVER_IP);
    if ((::connect(g_sClient, (sockaddr*)&servAddr, sizeof(sockaddr_in))) == INVALID_SOCKET)
    {
    printf("Connect to Server Error!\n");
    exit(-1);
    }
    // 输入文件路径传输到server端
    SendFileNameToServer();
    // 接收server端传过来的信息,直到保存文件成功为止
    while (ProcessMsg() == true)
    {
    Sleep(1000);
    }
    return true;
    }
    // 打开文件失败
    bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader)
    {
    if (g_pBuff != NULL)//如果缓冲区内有数据
    return true;
    assert(pMsgHeader != NULL);
    printf("Cannot find file!\n");
    // 重新输入文件名称
    SendFileNameToServer();
    return true;
    }
    // 分配空间以便写入文件
    bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader)
    {
    assert(pMsgHeader != NULL);
    if (g_pBuff != NULL)
    {
    return true;
    }

          

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

评论

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