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


Автор: hiho 10.2.2010, 16:59
Достались в наследство исходники клиент-серверного приложения. Причем клиент написан на дельфях, а сервер на С++.
Необходимо организавать передачу файлов от клиента к серверу, с условием "чтобы срочно, а то без премии останешься".
Пробовал отправять так: 
Код

    FS := TFileStream.Create('Путь к файлу',fmOpenRead);
    MainForm.Client.Socket.SendText('name' + 'Путь куда сохраняем');
    MainForm.Client.Socket.SendText('size' + IntToStr(FS.Size));
    FS.Position := 0;
    MainForm.Client.Socket.SendStream(FS);


А принимал:
Код

while ((memset(buff, 0, sizeof(buff) / sizeof(buff[0]))) && 
(bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) && bytes_recv != SOCKET_ERROR)
{
     if ((buff[0] == 's') && (buff[1] == 'i') && (buff[2] == 'z') && (buff[3] == 'e'))
     {
          //Получаем сведения о размере передаваемого файла
          char temp[100];
          int i;
          for(i = 4; i<=strlen(buff); i ++) temp[i-4] = buff[i];
          temp[i-4] = '\0';
          size = atoi(temp);
     } else if ((buff[0] == 'n') && (buff[1] == 'a') && (buff[2] == 'm') && (buff[3] == 'e'))
        {
             for(int i = 4; i<=100; i ++) name[i-4] = buff[i];
             File = fopen(name,"wb");//Где FILE *File объявлен ранее
        } else
           {
                fwrite(buff, bytes_recv, 1, File);
        sizeR += bytes_recv;//Переменная sizeR содержит колличество принятых байт
        if (sizeR == size) 
                        {
              fclose(File);
              MessageBox(0,"Файл принят успешно",name,0); 
        }
            }
}


При передаче файла по IP 127.0.0.1 все работает как положено, а когда выпускаю на просторы локальной или глобальной сетей постоянно пишет меньше чем положено на несколько килобайт, и соответственно происходит зависание.

Может есть у кого какие нибудь соображения как лучше передавать и принимать файлы.

Автор: SVN74 11.2.2010, 00:24
CreateFile
WriteFile
ReadFile 
Можно использовать совместно с сокетом...

Автор: hiho 11.2.2010, 04:49
Проблему решил, немного доработав свой изначальный код.
А вот обратную передачу(от сервера - клиенту) сделал как раз с помощью "CreateFile" и  "WriteFile". Вроде все работает как надо! Спасибо!

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