@enotiiik

Как правильно передавать данные через сокеты?

В университете изучаем сетевое программирование на языке С++. Задали лабораторную, с ней возникли проблемы. Програма-сервер формирует матрицу целых случайных чисел, програма-клиент получает матрицу и выводит её.

Первый вариант решения был такой.

Код сервера:
for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            string buf = to_string(rand() % 100);
            const char* msg = buf.c_str();
            send(newConnection, msg, sizeof(msg), NULL);
            cout << msg << endl;
        }
    }


Код клиента:
char msg[256];
    int iRez;
    do {
        iRez = recv(Connection, msg, sizeof(msg), NULL);
        cout << msg << endl;
    } while (iRez > 0);

Здесь проблема в том, что некоторые числа теряются.
Скриншот с результатами работы
61af839f0cd8b123726280.png

Пока писал вопрос не так много стало теряться, но перед этим больше половины не было.

Есть и второй вариант решения. В нём я пакую все числа и разделители( \t и \n) в одну строку о отправляю.

Код сервера:
string msg="";
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            msg = msg + to_string(rand() % 100) + "\t";
        }
        msg += "\n";
    }
    const char* c_msg = msg.c_str();
    cout << c_msg << endl;
    send(newConnection, c_msg, sizeof(c_msg), NULL);


Код клиента:
recv(Connection, msg, sizeof(msg), NULL);
    cout << msg;

Результат такой:
Скриншотт с результатами работы
61af84ed5e929935799785.png

Как правильно передать/получить матрицу? Если есть внятная литература или сайты по теме буду благодарен.
  • Вопрос задан
  • 44 просмотра
Решения вопроса 2
@none7
send и recv это функции работающие с бинарными данными. Для них очень важна корректная длина.
send(newConnection, msg, sizeof(msg), NULL); sizeof это чисто сишная конструкция. В данном случае она возвращает 4 или 8 в зависимости от архитектуры машинного кода программы. То есть размер указателя.
Ответ написан
Комментировать
@enotiiik Автор вопроса
Ошибка была в длине передаваемого сообщения на стороне сервера. В размер действительно попадал размер указателя на массив вместо размера самого текста. Решил проблему так:
string msg="";
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            msg = msg + to_string(rand() % 100) + "\t";
        }
        msg += "\n";
    }
    int sizeofmsg = msg.length(); 
    const char* c_msg = msg.c_str();
    send(newConnection, c_msg, sizeofmsg, NULL);

Но затем появилась проблема с артефактами. Их я убрал с помощью зануливания принимающего массива на стороне клиента:
char msg[256];
    ZeroMemory(msg, sizeof(msg));
    recv(Connection, msg, sizeof(msg), NULL);
    cout << msg;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы