Модераторы: xvr

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> не передаётся файл в клиент-сервер 
V
    Опции темы
redwhite90
Дата 12.12.2011, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



не понимаю почему не передаётся файл
сервер:
Код


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

void filesend(char * fpath,int sock);
void read_config( char* fpath,char* mask);
int main()
{
    int sock, listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1);
    cout<<"run server\n wait clients...\n";
    while(1)
    {
        sock = accept(listener, NULL, NULL);
        if(sock < 0)
        {
            perror("accept");
            exit(3);
        }
        else
        {
            cout<<"client connected"<<endl;
        }

        switch(fork())
        {
        case -1:
            perror("fork");
            break;

        case 0:
        {

          close(listener);
         /*   while(1)
            {
                bytes_read = recv(sock, buf, 1024, 0);
                if(bytes_read <= 0) break;
                cout << buf <<endl;

                send(sock, buf, bytes_read, 0);
           }*/
            char fpath[50];
            char mask[50];
            cout<< fpath << mask<<endl;
            filesend(fpath,sock);
            cout<<"file send"<<endl;
            close(sock);
            cout<<"client disconnect"<<endl;
            _exit(0);
        }
        default:
            close(sock);
        }
    }

    close(listener);

    return 0;
}
void filesend(char * fpath,int sock)
{

    char filename[50];
    int i=strlen(fpath);
    for(;i>0;i--)if(fpath[i-1]=='\\')break;
    for(int j=0;i<=(int)strlen(fpath);i++)filename[j++]=fpath[i];
////////////////////////////////////////

    ifstream myFile (fpath, ios::in|ios::binary|ios::ate);
    int size = (int)myFile.tellg();//текущая позиция в потоке
    myFile.close();

    char filesize[10];
    sprintf(filesize,"%i",size);

    //send( sock, filename, strlen(filename), 0 );//отправляем имя
    char rec[32] = "";
    //recv( sock, rec, 32, 0 );

    send( sock, filesize, strlen(filesize), 0 );//отправляем размер файла
    recv( sock, rec, 32, 0 );//принимаем подтверждение

    FILE *fr = fopen(fpath, "rb");

    while(size > 0)
      {
            char buffer[1030];

        if(size>=1024)
        {
            fread(buffer, 1024, 1, fr);
            cout<<buffer<<endl;
            send( sock, buffer, 1024, 0 );
            recv( sock, rec, 32, 0 );

        }
        else
        {
            fread(buffer, size, 1, fr);
            buffer[size]='\0';
            cout<<buffer<<endl;
            send( sock, buffer, size, 0 );
            recv( sock, rec, 32, 0 );
        }

        size -= 1024;

    }
}


void read_config( char* fpath,char* mask)
{
    ifstream file;
    file.open("config");
    if(file.is_open())
    {
        file.getline(fpath,50);
        file.getline(mask,50);
    }
}


клиент
Код

#include "unistd.h"
#include <stdlib.h>
#include <cstdio>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>

using namespace std;

char message[] = "Hello there!\n";
char buf[sizeof(message)];
void filereceive(int sock);
//void read_config(char* fpath,char* mask);
int main()
{
    int sock;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425); // или любой другой порт...
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        exit(2);
    }
    char fpath[50];//="/home/red/Документы/new_os_1/files.txt";
    char mask[50];
  // read_config(fpath,mask);
   filereceive(sock);
  // cout<<fpath <<" "<<mask<<endl;
    /*while(true)
    {
        cin >>message;
        send(sock, message, sizeof(message), 0);
        recv(sock, buf, sizeof(message), 0);
        cout<< ">"<<buf << endl;
    }*/
    //---NEW-----передача файла

  //-----END----
    close(sock);
    cout<<"file receive"<<endl;
    return 0;
}



void filereceive(int sock)
{
            char rec[50] = "";
            char* filename = "rec_file.txt";
            FILE *fw = fopen(filename, "w");

            int recs = recv( sock, rec, 32, 0 );//приняли размер файла
            send( sock, "OK", strlen("OK"), 0 );

            rec[recs]='\0';
            int size = atoi(rec);
            while(size > 0)
            {
                char buffer[1030];

                if(size>=1024)
                {
                recv( sock, buffer, 1024, 0 );
                cout<< buffer<<endl;
                send( sock, "OK", strlen("OK"), 0 );
                fwrite(buffer, 1024, 1, fw);

                }
                else
                {
                recv( sock, buffer, size, 0 );
                cout<< buffer<<endl;
                send( sock, "OK", strlen("OK"), 0 );
                buffer[size]='\0';
                fwrite(buffer, size, 1, fw);

                }

                size -= 1024;

            }

            fclose(fw);
}



и не понятно как это отладить можно...fork не создаёт дочерний процесс или мне в него не залезть при отладке....

Это сообщение отредактировал(а) redwhite90 - 12.12.2011, 00:50
PM MAIL   Вверх
boostcoder
Дата 12.12.2011, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  12.12.2011,  00:48 Найти цитируемый пост)
fork

зачем вообще ты его использовал? оО

Добавлено через 2 минуты и 2 секунды
опиши, что не так с кодом? влом компилить.
PM WWW   Вверх
redwhite90
Дата 12.12.2011, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Цитата(boostcoder @  12.12.2011,  03:25 Найти цитируемый пост)
forkзачем вообще ты его использовал? оО

чтобы разделить процесс соединения и процесс работы с клиентом.

Цитата(boostcoder @  12.12.2011,  03:25 Найти цитируемый пост)
опиши, что не так с кодом? влом компилить.

до этого передавал в противоположную сторону(клиент=> сервер) работало. а сейчас файлик создаётся, но так пустым и остаётся
PM MAIL   Вверх
boostcoder
Дата 12.12.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  12.12.2011,  08:25 Найти цитируемый пост)
чтобы разделить процесс соединения и процесс работы с клиентом.

ну так fork тут не единственный способ. при том, ниразу не переносимый. какой смысл писать одноразовый код?
банальный способ - каждого клиента в отдельный поток.
по лучше способ - неблокируюший ввод-вывод и пул потоков.
самый разумный, использовать что-то вроде boost.asio.


Цитата(redwhite90 @  12.12.2011,  08:25 Найти цитируемый пост)
сейчас файлик создаётся, но так пустым и остаётся

### %)
мне что, догадываться нужно? опиши же нормально, до куда выполняется, значения отправленные/принятые, и т.д..
PM WWW   Вверх
svlary
Дата 12.12.2011, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(redwhite90 @  12.12.2011,  00:48 Найти цитируемый пост)
и не понятно как это отладить можно...

   В том коде, который Вы приложили, есть много непонятного... Например :
 
Код

char fpath[50];
char mask[50];
cout<< fpath << mask<<endl;
filesend(fpath,sock);

    Эти строки где-то инициализируются ?

   Открывая файл
Код

FILE *fr = fopen(fpath, "rb");

  Вы не проверяете - а открылся ли он ? Если нет, то на принимающей стороне как раз и образуется пустой файл...

Цитата

fork не создаёт дочерний процесс или мне в него не залезть при отладке...

  А зачем отладчик тут ? Вставьте  печать сообщения после case 0: типа cout<<"fork started!"<<endl;
PM MAIL   Вверх
redwhite90
Дата 12.12.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Цитата(svlary @  12.12.2011,  12:11 Найти цитируемый пост)
код C++1:2:3:4:char fpath[50];char mask[50];cout<< fpath << mask<<endl;filesend(fpath,sock);highlightSyntax('cpp_jM4NDF','cpp');    Эти строки где-то инициализируются ?

Да, это косяк...исправил добавлением
Код

read_config(fpath,mask);


только теперь очень непонятное что-то присходит.
Когда запускаю сервер из code::blocks, а клиент из терминала(запуском исполняемого файла из bin/debug)
всё работает, и файл записывается...
Когда запускаю оба из терминала, то файл образуется, но пустой....
 с чем это может быть связано не понятно.



Это сообщение отредактировал(а) redwhite90 - 12.12.2011, 12:24
PM MAIL   Вверх
svlary
Дата 12.12.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(redwhite90 @  12.12.2011,  12:21 Найти цитируемый пост)
 с чем это может быть связано не понятно

  Может быть - с правами доступа ? Попробуйте писать выходной файл в общедоступное место... Типа /tmp...
PM MAIL   Вверх
redwhite90
Дата 12.12.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



boostcoder, задача состоит в знакомстве именно с линуксовыми функциями.(хоть и одноразовый код)

очень похоже, что файл(отправляемый) вообще не открывается.потому, что стоят ауты буфера,  и ничего не видно.

Добавлено через 1 минуту и 14 секунд
мне кажется, что когда я запуская исполняемый файл и проект в code::blocks исходный файл ищется в разных местах
PM MAIL   Вверх
boostcoder
Дата 12.12.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  12.12.2011,  12:31 Найти цитируемый пост)
задача состоит в знакомстве именно с линуксовыми функциями.(хоть и одноразовый код)

BSD sockets - это стандарт. мне не известны архитектуры где бы они не поддерживались.
а использование fork делает твой код не переносимым на win платформы. да технология process-per-session стара как какашка динозавра.
PM WWW   Вверх
redwhite90
Дата 12.12.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



сейчас проверил.  при запуске из терминала не открывается ни передаваемый файл, ни config.

права доступа врятли разные у терминала и  code::blocks

Добавлено через 7 минут и 20 секунд
boostcoder, очевидно, что не в fork дело.
*хоть раз в жизни его поиспользую)
PM MAIL   Вверх
xvr
Дата 12.12.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(redwhite90 @  12.12.2011,  12:41 Найти цитируемый пост)
сейчас проверил.  при запуске из терминала не открывается ни передаваемый файл, ни config.

При запуске из терминала у вас конфиг и передаваемый файл должны лежать в той директории, откуда вы вбивали приказ (запускали свой сервер). Они действительно там лежат?


PM MAIL   Вверх
redwhite90
Дата 12.12.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



XVR, да в этом проблема была....спс

Добавлено через 23 секунды
XVR, да в этом проблема была....спс

Добавлено через 24 секунды
XVR, да в этом проблема была....спс
PM MAIL   Вверх
svlary
Дата 12.12.2011, 18:41 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(boostcoder @  12.12.2011,  12:40 Найти цитируемый пост)
 делает твой код не переносимым на win платформы. 

   И слава Богу ! Большей глупости, чем ПЕРЕНОСИМЫЕ программные системы не мог придумать даже Билл Гейтс! smile  Главгным достоинством C# была объявлена его ПЕРЕНОСИМОСТЬ ! smile И что - Билли собирался переписать Office на C# и переносить его... Куда - переносить ? smile На МАС ? Или на люникс ?! smile)))))

Цитата
технология process-per-session стара как какашка динозавра. 

  Колесо изобрели еще раньше ! Вы предлагает всем ездить на деревянных велосипедах с треугольными колесами ? smile
Кстати, не обязательно говорить о СЕССИИИ. Например, в Апаче процессы создаются под ЗАПРОС а вовсе не под сессию. Просто потому, что HTTP не разумеет понятия "сессия". И ничего - до сих пор остается самым популярным HTTP сервером в мире... smile
PM MAIL   Вверх
boostcoder
Дата 12.12.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



svlary, к чему этот бред? прорвало?
PM WWW   Вверх
newbee
Дата 12.12.2011, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: нет
Всего: 19



Цитата(svlary @  12.12.2011,  19:41 Найти цитируемый пост)
На МАС ? Или на люникс ?!
Дык мс офис на маках есть. А линукс никому не нужен, вот и офиса на нем нет!


--------------------
You're face to face
With man who sold the world
PM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.