Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отправка файлов по TCP


Автор: Sergio 29.8.2008, 15:38
Здраствуйте. Пишу алгоритм передачи файла на другой компьютер. Возможности пока небыло проверить код.
Пожалуйста оцените концепцию и по возможности оптимизируйте:

Код

#define BUFFER_SIZE = 4096;

struct Package
{
    char bufferFile[bufferSize];
    char pathFile[255];
    int fileSize;
}

Реализация клиента:
Код

// File sending using TCP protocol
int TransferFile(char *pathFile, int port, char* IP)
{
    Package pack = {0};
    
    pack.fileSize = GetFileSize(pathFile);
    int piecesCount = pack.fileSize / BUFFER_SIZE;
    SOCKET hClientSocket = Connect(port, IP);
    HANDLE hFile = OpenFile(pathFile);

    for(int currentBuffer = 0; currentBuffer<piecesCount; currentBuffer++)
    {
        pack.bufferFile[bufferSize] = ReadBufferFromFile(hFile, currentBuffer);
        send(hClientSocket, pack);

Код

        // Report about buffer receiving by server
        // Limit time is 5 seconds
        for(int timesCount = 0; timesCount<50; timesCount++)
        {
            SOCKET hServerSocket = accept(hClientSocket);            
            if(hServerSocket != 0)
            {
                if(pack.bufferFile == "Package recived")
                {
                    pack.bufferFile == "";
                    closeSocket(hServerSocket);
                    break;
                }
                else if(pack.bufferFile == "Package fail")
                {
                    // don't send any package 
                    closeSocket(hServerSocket);
                    socketClose(hClientSocket);
                    fclose(hFile);    
                    return -1;
                }
            }
            sleep(100);            
        }
         break;
    }    
     socketClose(hClientSocket);
     fclose(hFile);    
     return 0;
}

Серверная часть:
Код

int ReceivingFile()
{
    Package pack = {0};
    SOCKET hSocketClient;

    while(hSocketClient != 0)
      hSocketClient = accept(hServerSocket);

    recv(hServerSocket, pack);

    if(CheckSpaceOnHard(pack.fileSize) != 0)
    {
        pack.bufferSize = "Package fail";

        // Send report about delivering
        send(hClientSocket, pack);     
    }

Код

   if( pack.bufferFile != 0)
    {
        HANDLE hFile = CreateFile(pack.pathFile);
        int piecesCount = pack.fileSize / BUFFER_SIZE;

        for(int currentBuffer = 0; currentBuffer<piecesCount; currentBuffer++)
        {
            
            int error = WriteBufferToFile(hFile, pack.bufferFile);
            if(error == 0)
            {
                pack.bufferSize = "Package recived";

                // Send report about delivering
                send(hClientSocket, pack);
            }            
            recv(hServerSocket, pack);
        }                
    }
       fclose(hFile);    
       return 0;
}

Заранее спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)