Проблема такова. Есть 2 сервера и 1 клиент. Клиент отправляет первому серверу матрицу. Он ее находит и возвращает 2 матрицы обратно. Здесь проблем нет. Но при отправке с клиента на 2 сервер 2-ух этих матриц плюс массив. Возникает проблема. Все что отправлено после массива не приходит на сервер.
Код клиента.
if (config[0] != "")
{
raz.setMasLength(Files.getMasLength());
raz.setMatrixAandMasB(Files.getMatrixA(), Files.getMasB());
start = clock();
1 сервер здесь все работает
SOCKET socketConnection = NetWork.openClient(config[0], config[1], stoi(config[2]));
NetWork.sendMasLength(socketConnection, raz.getMasLength());
NetWork.sendMatrix(socketConnection, raz.getMasLength(), raz.getMatrixA());
raz.setMatrixL(NetWork.recvMatrix(socketConnection, raz.getMasLength()));
raz.setMatrixU(NetWork.recvMatrix(socketConnection, raz.getMasLength()));
NetWork.closeSocket(socketConnection, config[0]);
2 сервер
SOCKET socketConnections = NetWork.openClient(config[3], config[4], stoi(config[5]));
NetWork.sendMasLength(socketConnections, raz.getMasLength());
//Вот тут и начинаются проблемы.
NetWork.sendMas(socketConnections, raz.getMasLength(), raz.getMasB());
NetWork.sendMatrix(socketConnections, raz.getMasLength(), raz.getMatrixL());
NetWork.sendMatrix(socketConnections, raz.getMasLength(), raz.getMatrixU());
raz.setMasX(NetWork.recvMas(socketConnections, raz.getMasLength()));
NetWork.closeSocket(socketConnections, config[3]);
end = clock();
cout << "Время обработки :" << ((double)end - start) / ((double)CLOCKS_PER_SEC) << " секунд." << endl;
raz.getMasX();
}
Код Класса работающего с сетью. Индентичен за исключение создания подключения сервер/клиент.
int WorkNetwork::recvMasLength(SOCKET socket)
{
int result = 0;
recv(socket, (char*)&result, sizeof(result), 0);
return result;
}
void WorkNetwork::sendMatrix(SOCKET socket, vector<vector<float>> matrix)
{
for (auto& x : matrix)
{
send(socket, (char*)x.data(), x.size() * sizeof(float), 0);
}
}
vector<vector<float>> WorkNetwork::recvMatrix(SOCKET socket, int masLength)
{
vector<vector<float>>matrixTemp(masLength, vector<float>(masLength));
for (int i = 0; i < masLength; i++)
{
recv(socket, (char*)matrixTemp[i].data(), sizeof(float)*masLength, 0);
}
return matrixTemp;
}
void WorkNetwork::closeConnection(SOCKET socket)
{
if (closesocket(socket) == 0)
{
cout << "Server stoped" << endl;
}
}
Код 1 сервера.
system("cls");
setlocale(LC_ALL, "Russian");
WorkFile Files;
WorkNetwork WorkNet;
server_config = Files.ReadFromFileXml();
SOCKET socket = WorkNet.openServerConnection(server_config[0], server_config[1], server_config[2]);
masLength = WorkNet.recvMasLength(socket);
initVetor();
matrixA = WorkNet.recvMatrix(socket,masLength);
naxoshdenie_LU();
WorkNet.sendMatrix(socket, matrixL);
WorkNet.sendMatrix(socket, matrixU);
WorkNet.closeConnection(socket);
system("pause");
Код 2 сервера.
system("cls");
setlocale(LC_ALL, "Russian");
WorkFile Files;
WorkNetWork WorkNet;
server_config = Files.ReadFromFileXml();
SOCKET socket = WorkNet.openServerConnection(server_config[0], server_config[1], server_config[2]);
masLength = WorkNet.recvMasLength(socket);
initVetor();
masB = WorkNet.recvMas(socket, masLength);
matrixL = WorkNet.recvMatrix(socket, masLength);
matrixU = WorkNet.recvMatrix(socket, masLength);
naxoshdenieX();
WorkNet.sendMas(socket, masX, masLength);
WorkNet.closeConnection(socket);
system("pause");
Проблема заключается в следующем. При отправке матрицы скажем 200*200 все хорошо. Но при отправке матрицы 1300*1300 или 2800*2800. На второй сервер не приходит ничего кроме массива. Я подозреваю что и на клиент с первого тоже не все доходит.
По умолчанию, recv читает "сколько может, но не больше, чем указанный размер". Поэтому, вполне может быть, что recv прочитал только пол массива.
По хорошему, нужно всегда проверять, сколько прочиталось (это и возвращает recv) и по необходимости дочитывать. Или использовать спецфлаг MSG_WAITALL.
С send такая же ситуация. send вполне может отправить два-три байта. И это нужно контролировать. На en.SO есть пример.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники