zoukankan      html  css  js  c++  java
  • VC+CSocket文件传送示例

    服务器端示例代码

    #define PRE_AGREED_PORT         8686 //定义端口号
    #define SEND_BUFFER_SIZE     4096 //buffer大小

    BOOL CYourServerClass::SendFileToRemoteRecipient(CString fName)
    {
        
        

         AfxSocketInit(NULL);
         CSocket sockSrvr; 
         sockSrvr.Create(PRE_AGREED_PORT);//创建一个Sokcet并监听
         sockSrvr.Listen();//监听
         CSocket sockConnection;
         //用另一个Soket来收发数据
         sockSrvr.Accept(sockConnection);
         //接受从客户端发来的连接请求
        
    BOOL bRet = TRUE;
        
         int fileLength, cbLeftToSend;
         BYTE* sendData = NULL;

         CFile sourceFile;
         CFileException fe;
         BOOL bFileIsOpen = FALSE;
        
         if( !( bFileIsOpen = sourceFile.Open( fName, 
                CFile::modeRead | CFile::typeBinary, &fe ) ) )
         {
             TCHAR strCause[256];
             fe.GetErrorMessage( strCause, 255 );
             TRACE( "SendFileToRemoteRecipient encountered 
               an error while opening the local file\n"
               "\tFile name = %s\n\tCause = %s\n\tm_cause = %d\n\tm_IOsError = %d\n",
               fe.m_strFileName, strCause, fe.m_cause, fe.m_lOsError );
            
             //在这里处理错误
            
             bRet = FALSE;
             goto PreReturnCleanup;
         }

         //首先发送文件长度

         fileLength = sourceFile.GetLength();
         fileLength = htonl( fileLength );

         cbLeftToSend = sizeof( fileLength );

         do
         {
             int cbBytesSent;
             BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - cbLeftToSend;
             cbBytesSent = sockConnection.Send( bp, cbLeftToSend );
            
             // test for errors and get out if they occurred
             if ( cbBytesSent == SOCKET_ERROR )
             {
                 int iErr = ::GetLastError();
                 TRACE( "SendFileToRemoteRecipient returned a socket
                     error while sending file length\n"
                     "\tNumber of Bytes sent = %d\n"
                     "\tGetLastError = %d\n", cbBytesSent, iErr );
                
                 //在这里处理错误

                 bRet = FALSE;
                 goto PreReturnCleanup;
             }
            
             cbLeftToSend -= cbBytesSent;
         }
         while ( cbLeftToSend>0 );
        
        
         //开始发送文件数据
         sendData = new BYTE[SEND_BUFFER_SIZE]; 
        
         cbLeftToSend = sourceFile.GetLength();
        
         do
         {
            
            
             int sendThisTime, doneSoFar, buffOffset;
            
             sendThisTime = sourceFile.Read( sendData, SEND_BUFFER_SIZE );
             buffOffset = 0;
            
             do
             {
                 doneSoFar = sockConnection.Send( sendData + buffOffset, 
                                                         sendThisTime ); 
                
             //看执行是否成功
                 if ( doneSoFar == SOCKET_ERROR )
                 {
                     int iErr = ::GetLastError();
                     TRACE( "SendFileToRemoteRecipient returned a socket error 
                         while sending chunked file data\n"
                         "\tNumber of Bytes sent = %d\n"
                         "\tGetLastError = %d\n", doneSoFar, iErr );
                    
                     //处理错误
                    
                     bRet = FALSE;
                     goto PreReturnCleanup;
                 }
                
                
                 buffOffset += doneSoFar;
                 sendThisTime -= doneSoFar;
                 cbLeftToSend -= doneSoFar;
             }
             while ( sendThisTime > 0 );
            
         }
         while ( cbLeftToSend > 0 );
        
        
    PreReturnCleanup: // 出口点
        
         delete[] sendData;
        
         if ( bFileIsOpen )
             sourceFile.Close();
        
        
         sockConnection.Close();
        
         return bRet;

    }

    客户端示例代码

    #define PRE_AGREED_PORT         8686
    #define RECV_BUFFER_SIZE     4096

    BOOL CYourClientClass::GetFileFromRemoteSender(CString strIP, 
                                                    CString fName)
    {
         AfxSocketInit(NULL);
         CSocket sockClient;
         sockClient.Create();
         // PRE_AGREED_PORT 是 #define   8686
         sockClient.Connect( strIP, PRE_AGREED_PORT );
        
         //连接服务器
        
        
        
         BOOL bRet = TRUE; 
        
         int dataLength, cbBytesRet, cbLeftToReceive;
         BYTE* recdData = NULL;
        
         CFile destFile;
         CFileException fe;
         BOOL bFileIsOpen = FALSE;
        
         //打开或创建文件
        
         if( !( bFileIsOpen = destFile.Open( fName, CFile::modeCreate | 
                CFile::modeWrite | CFile::typeBinary, &fe ) ) )
         {
             TCHAR strCause[256];
             fe.GetErrorMessage( strCause, 255 );
             TRACE( "GetFileFromRemoteSender encountered 
               an error while opening the local file\n"
               "\tFile name = %s\n\tCause = %s\n\tm_cause = %d\n\tm_IOsError = %d\n",
               fe.m_strFileName, strCause, fe.m_cause, fe.m_lOsError );
            
             //在这里处理错误
            
             bRet = FALSE;
             goto PreReturnCleanup;
         }
        
        
         //得到文件的大小
         cbLeftToReceive = sizeof( dataLength );
        
         do
         {
             BYTE* bp = (BYTE*)(&dataLength) + sizeof(dataLength) - cbLeftToReceive;
             cbBytesRet = sockClient.Receive( bp, cbLeftToReceive );
            
            
             if ( cbBytesRet == SOCKET_ERROR || cbBytesRet == 0 )
             {
                 int iErr = ::GetLastError();
                 TRACE( "GetFileFromRemoteSite returned 
                   a socket error while getting file length\n"
                   "\tNumber of Bytes received (zero means connection was closed) = %d\n"
                   "\tGetLastError = %d\n", cbBytesRet, iErr );
                
             //处理错误
                
                 bRet = FALSE;
                 goto PreReturnCleanup;
             }
            
            
             cbLeftToReceive -= cbBytesRet;
            
         }
         while ( cbLeftToReceive > 0 );

         dataLength = ntohl( dataLength );

        
        
         recdData = new byte[RECV_BUFFER_SIZE];
         cbLeftToReceive = dataLength;
        
         do
         {    
             int iiGet, iiRecd;

             iiGet = (cbLeftToReceive<RECV_BUFFER_SIZE) ? 
                           cbLeftToReceive : RECV_BUFFER_SIZE ;
             iiRecd = sockClient.Receive( recdData, iiGet );

        
             if ( iiRecd == SOCKET_ERROR || iiRecd == 0 )
             {
                 int iErr = ::GetLastError();
                 TRACE( "GetFileFromRemoteSite returned a socket error 
                     while getting chunked file data\n"
                     "\tNumber of Bytes received (zero means connection was closed) = %d\n"
                     "\tGetLastError = %d\n", iiRecd, iErr );
                
        //要在这里处理错误
                
                 bRet = FALSE;
                 goto PreReturnCleanup;
             }

            
             destFile.Write( recdData, iiRecd); // 写入数据
             cbLeftToReceive -= iiRecd;

         } 
         while ( cbLeftToReceive > 0 );

    PreReturnCleanup: // 入口点
        
         delete[] recdData;        
        
         if ( bFileIsOpen )
             destFile.Close();

        
         sockClient.Close();
        
         return bRet;
    }

  • 相关阅读:
    批量重命名工具 Bulk Rename Utility
    Makefile中的ifeq 多条件使用
    利用Python批量下载邮件附件
    在线随机抽取工具、在线汉字转拼音
    《如何把事情做到最好》读书笔记
    Android 通过adb快速恢复出厂设置
    Makefile的ifeq逻辑或,逻辑与的变通实现
    Android 获取后台正在运行的第三方应用列表
    Android.mk 中 filter 和 filterout 的用法
    Android TV端电视直播软件 和 投屏工具
  • 原文地址:https://www.cnblogs.com/mfryf/p/2354124.html
Copyright © 2011-2022 走看看