Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
1

Функция recv принимает неизвестные данные

05.06.2016, 10:55. Показов 914. Ответов 13
Метки нет (Все метки)

Проконтролировал отладчиком программу. Выяснил что клиент получает пустую строку т.е. (""), хотя на сервере никакой отправки не происходило. Как это исправить? P.s.Вся программа из-за этого не летит.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2016, 10:55
Ответы с готовыми решениями:

Функция recv
Привет всем! Решил написать простенький ftp клиент, чтобы понять сущность работы сокетов. ...

Функция recv()
Хэлоу! Несколько вопросов по поводу использования функции recv() в Linux: 1) функция не успевает...

Почему функция recv() возвращает 0?
Вроде бы, она возвращает либо -1, либо количество принятых байт. Я отправляю сообщения от...

Как функция recv() читает UDP-пакеты?
отправленный пакет с udp клиента ( при помощи функции send()) читается на сервере за один раз (при...

13
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 10:58 2
1sergei, Можно увидеть код?
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
05.06.2016, 11:02  [ТС] 3
Функция Клиент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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);
}
Добавлено через 1 минуту
Функция сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void Transport_system::add_transport_system()
{
    char buf[30];
    int value = 0;
    recv(s, buf, strlen(buf), 0);
    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);
}
В клиенте в последней строке читает неизвестные данные
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 11:39 4

Не по теме:

Сейчас глянем



Добавлено через 32 минуты
Вот вы от сервера отправили подтверждение о том, что данные внесены в файл.
Цитата Сообщение от 1sergei Посмотреть сообщение
send(s, "1\0", 2, 0);
Вот вы приняли эти данные и их обработали.
Цитата Сообщение от 1sergei Посмотреть сообщение
recv(socket, buf2, strlen(buf2), 0);//принимаем что всё ОК
if (atoi(buf2) == 1)
cout << "\n\tДанные успешно занесены";
else
cout << "Ошибка записи данных";
}
Сервер закончил свою работу, а вы всё еще ждете от него сообщения. Если вы хотите записать в buf единицу, то поставьте в предыдущем вызове recv в 4 аргументе флаг MSG_PEEK.
Цитата Сообщение от 1sergei Посмотреть сообщение
recv(socket, buf, strlen(buf), 0);
Добавлено через 2 минуты
Я не совсем понимаю, что вы пытаетесь сделать этим, когда пытаетесь принять данные которые не отправляли.
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
05.06.2016, 11:41  [ТС] 5
Я вас понял. в последней строке, я забыл поставить комментарий. Там клиент как раз-таки принимает строку, хотя не должен. Я не могу понять почему это происходит.
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 11:43 6
1sergei, Можно объяснить мне зачем принимать данные которые никто не записывал с сокет?
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
05.06.2016, 11:51  [ТС] 7
у меня дальше идёт выход из функции и принимаются данные. So, происходит сдвиг send/recv и программа летит из-за того, что якобы клиент принял пустую строку, кот. сервер не передавал.
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 11:56 8
1sergei, Так клиент и должен принять пустую строку, потому что данные, которые вы пытаетесь получить не были записаны в сокет.
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
05.06.2016, 12:08  [ТС] 9
можно поподробнее пожалуйста. Я не совсем понимаю о чём идёт речь. Программирую на сокетах редко. Как мне это исправить?
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 12:49 10
1sergei, Я совсем не понимаю, что вы хотите сделать когда принимаете данные в конце. И можно уж тогда весь код.

Добавлено через 42 секунды
Каков результат вы ожидаете в конце, когда принимаете пустые данные?
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
05.06.2016, 12:55  [ТС] 11
макс, ты совершенно прав, что я принимаю эту строку. Я это делаю, чтобы просто очистить поток, т.к. эта принятая пустая строка, в случае если я это её не считаю, потом считывается в ненужном мне месте и происходит сбой программы. Что касается кода, то это Курсач. Я не думаю, что тебе будет приятно лезть в эти дебри.
Я сформулирую вопрос конкретней: ПОЧЕМУ КЛИЕНТ ПОЛУЧАЕТ ПУСТУЮ СТРОКУ ОТ СЕРВЕРА, ЕСЛИ СЕРВЕР ЕЁ НЕ ПЕРЕДАВАЛ.
Есть ли у тебя какие-нибудь предположения?
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 13:34 12
1sergei, Покажи код полностью.

Добавлено через 1 минуту
Если ты в recv 4 аргумент равен нулю, то после принятия строка очищается.

Добавлено через 6 минут
1sergei, Еще может быть причиной то, что передаваемые данные просто не влезают в массив.
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 19
05.06.2016, 14:17  [ТС] 13
https://www.dropbox.com/s/rf2y... 0.rar?dl=0
admin: login-q, password-q
user: login-w, password-w
Смотри файл transpotr_system.cpp -> add_transport_system()
Вызывается из файла User.cpp ->menu_admin()
код, описанный выше немного преобразован, прошлая версия в коментариях
0
47 / 21 / 11
Регистрация: 01.11.2013
Сообщений: 255
05.06.2016, 16:23 14
Сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void Transport_system::add_transport_system()
{
    HANDLE hWrite = CreateEvent(NULL, FALSE, FALSE, "WriteEvent");
    HANDLE hRead = CreateEvent(NULL, FALSE, FALSE, "ReadEvent");
    char buf[30];
    int value = 0;
    recv(s, buf, strlen(buf), 0);
    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++)
            {
                WaitForSingleObject(hWrite, INFINITE); //Ждём пока клиент запишет данные
                capacity[i][j] = recv_number(); //Считываем данные
                SetEvent(hRead); // Разрешаем клиенту повторную запись
            }
    }
    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";
    }
    send_number(1);
    f.close();
}
C++
1
2
3
4
5
6
void Transport_system::send_number(int pool)
{
    char buf[10];
    _itoa_s(pool, buf, 10, 10);
    send(s, buf, strlen(buf), 0);
}
Клиент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void Transport_system::add_transport_system()
{
    HANDLE hWrite = CreateEvent(NULL, FALSE, FALSE, "WriteEvent");
    HANDLE hRead = CreateEvent(NULL, FALSE, FALSE, "ReadEvent");
 
    char buf[5];
    system("cls");
    set_name();
    set_amount_of_centers();
    set_matrix();
    name[strlen(name)] = '\0';
    send(socket, name, strlen(name) + 1, 0);
    //
    recv(socket, buf, sizeof(buf), 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); // Отправляем данные
                SetEvent(hWrite); //Показываем серверу, что данные были отправленны
                WaitForSingleObject(hRead, INFINITE); //Ждём пока сервер прочитает данные
            }
        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);
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2016, 16:23

Неизвестные учетные данные
TeamViewer и Hamach поставила 8 декабря, поучилась пользоваться (было 2 ноута), а 10 января...

Функция recv не разблокируется после отправки сообщения в канал
Добрый день уважаемые форумчане. В общем, возникла проблема связанная с передаче данных через...

recv winsock, или как получить данные
приложение клиент-сервер на winsock допустим клиент законнектился к серверу. Сервер в свою...

Почему экзешник make.exe (вернее, его разновидность mingw32-make.exe) принимает неизвестные параметры?
Друзья! У меня есть одна из сборок mingw, а там, как известно файл make.exe отсутствует, а вместо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.