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


Автор: Sergei777 5.6.2016, 11:32
Прошёлся отладчиком по клиенту. Выяснил, что клиент принимает пустую строку, хотя сервером эти данные не отправляются. 
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);
}


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

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

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

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

Автор: feodorv 7.6.2016, 00:08
Цитата(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 значение. Это тоже большое безобразие.

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