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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция recv принимает неизвестные данные, Принятие неизвестных данных 
:(
    Опции темы
Sergei777
Дата 5.6.2016, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошёлся отладчиком по клиенту. Выяснил, что клиент принимает пустую строку, хотя сервером эти данные не отправляются. 
P.s. Последняя строка в клиенте. Она показывает пустую строку


Клиент:
Код
void Transport_system::add_transport_system()
{
    char buf[5];
    system("cls");
    set_name();
    set_amount_of_centers();
    set_matrix();
    name[strlen(name)] = '\0';
    send(socket, name, strlen(name) + 1, 0);
    do
        recv(socket, buf, sizeof(buf), 0);//принимаем данные, что такого файла не существует
    while (!(buf[0] == '1' || buf[0] == '0'));
    if (atoi(buf) == 1)//если не существует
    {
        int N = atoi(amountOfCenters);
        string matrix_string[100][100];
        char buf2[10];
        for (int i = 0; i < atoi(amountOfCenters); i++)
            for (int j = 0; j < atoi(amountOfCenters); j++)
            {
                _itoa_s(matrix[i][j], buf2, 10, 10);//отправляем матрицу
                matrix_string[i][j] = string(buf2);
            }
        amountOfCenters[strlen(amountOfCenters)] + '\0';
        send(socket, amountOfCenters, strlen(amountOfCenters) + 1, 0);//отправляем количество лог-центров
        for (int i = 0; i < atoi(amountOfCenters); i++)
            for (int j = 0; j < atoi(amountOfCenters); j++)
                send(socket, matrix_string[i][j].c_str(), matrix_string[i][j].size(), 0);
        recv(socket, buf2, strlen(buf2), 0);//принимаем что всё ОК    
        if (atoi(buf2) == 1)
            cout << "\n\tДанные успешно занесены";
        else
            cout << "Ошибка записи данных";
    }
    if (atoi(buf) == 0)//если существует
        cout << "Такая транспортная сеть уже существует\n";
    _getch();
    fflush(stdin);
    fflush(stdout);
    fflush(stderr);
    recv(socket, buf, strlen(buf), 0);  //здесь принимает неизвестно что
}


Сервер:
Код
void Transport_system::add_transport_system()
{
    char buf[30];
    int value = 0;
    recv(s, buf, strlen(buf), 0);   //1
    strcpy_s(name, strlen(buf) + 1, buf);
    strcpy_s(file_name, strlen(name) + 1, name);
    strcat_s(file_name, 34, ".txt");
    if (_access(file_name, 0)!=-1)
    {
        send_number(0);
        throw ("Транспортная сеть существует");
    }
    else
    {
        send_number(1);
        recv(s, buf, strlen(buf) + 1, 0);        //принимаем размер матрицы
        value = atoi(buf);//кол-во центров
        for (int i = 0; i < value; i++)
            for (int j = 0; j < value; j++)
                capacity[i][j] = recv_number();
    }
    ofstream f(file_name, ios_base::app);
    f << value << "\n";
    for (int i = 0; i < value; i++)
    {
        for (int j = 0; j < value; j++)
            f << capacity[i][j] << " ";
        f << "\n";
    }
    f.close();
    send(s, "1\0", 2, 0);
}



Это сообщение отредактировал(а) feodorv - 7.6.2016, 00:02
PM MAIL   Вверх
Alexeis
Дата 6.6.2016, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Sergei777 @  5.6.2016,  12:32 Найти цитируемый пост)
 Выяснил, что клиент принимает пустую строку, хотя сервером эти данные не отправляются. 

  Возможно из-за того что строка очень короткая. Для tcp по умолчанию работает алгоритм Нагла.
https://ru.wikipedia.org/wiki/%D0%90%D0%BB%...%B3%D0%BB%D0%B0 . Его можно отключить в принципе. 
Код

setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)); 

И отформатируйте код, кнопочкой "Код", а то читать трудно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
feodorv
Дата 7.6.2016, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Sergei777 @  5.6.2016,  11:32 Найти цитируемый пост)
    char buf[30];
    recv(s, buf, strlen(buf), 0);   //1
Честно говоря, это жуткая жуть. И она в нескольких местах. Надеюсь, всё же, что имелось в виду sizeof(buf).


Что значит:
Цитата(Sergei777 @  5.6.2016,  11:32 Найти цитируемый пост)
клиент принимает пустую строку
? Клиент принимает символ '\0'? Или recv() возвращает 0? В коде нигде не делается проверки на возвращаемое от recv значение. Это тоже большое безобразие.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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