Я пытаюсь отправить данные из вектора через сокет TCP.
Я работаю с вектором, который заполняю значениями от 0 до 4999, а затем отправляю его в сокет.
Клиентская сторона, я получаю данные в вектор, затем копирую их данные в другой вектор, пока не получу все данные с сервера.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я получаю свои данные, иногда я получаю все эти данные, а иногда я получаю только правильные данные от 0 до 1625, а затем я получаю данные корзины до конца (см. изображение ниже). Я даже получил, например, от 0 до 2600 правильных данных, затем с 2601 до 3500 это мусор и, наконец, с 3501 до 4999, это снова правильно.
(левый столбец - номер строки, а правый столбец - данные).
Это сторона сервера:
vector<double> values2;
for(int i=0; i<5000; i++)
values2.push_back(i);
skt.sendmsg(&values2[0], values2.size()*sizeof(double));
Функция sendmsg:
void Socket::sendmsg(const void *buf, size_t len){
int bytes=-1;
bytes = send(m_csock, buf, len, MSG_CONFIRM);
cout << "Bytes sent: " << bytes << endl;
}
Клиентская сторона:
vector<double> final;
vector<double> msgrcvd(4096);
do{
bytes += recv(sock, &msgrcvd[0], msgrcvd.size()*sizeof(double), 0);
cout << "Bytes received: " << bytes << endl;
//Get rid of the trailing zeros
while(!msgrcvd.empty() && msgrcvd[msgrcvd.size() - 1] == 0){
msgrcvd.pop_back();
}
//Insert buffer content into final vector
final.insert(final.end(), msgrcvd.begin(), msgrcvd.end());
}while(bytes < sizeof(double)*5000);
//Write the received data in a txt file
for(int i=0; i<final.size(); i++)
myfile << final[i] << endl;
myfile.close();
Выводы байтов правильные, сервер выводит 40 000 при отправке данных, а клиент также выводит 40 000 при получении данных.
Удаление конечных нулей, а затем вставка содержимого буфера в новый вектор не очень эффективны, но я не думаю, что это проблема. Если у вас есть какие-либо подсказки, как сделать его более эффективным, было бы здорово!
Я действительно не знаю, проблема в том, когда я отправляю данные или когда я их получаю, а также я не понимаю, почему иногда (редко) я получаю все данные.