У меня есть сервер, который подключается к клиенту и выполняет следующую связь:
void communicate(promise<long> && divisions, promise<long> && result, int sockt, long number, long prime) {
send(sockt, number);
send(sockt, prime);
long div = receive(sockt);
long res = receive(sockt);
divisions.set_value(div);
result.set_value(res);
}
void send(int sockt, long number) {
string numberString;
stringstream strstream;
strstream << number;
strstream >> numberString;
cout << "Sending: " << number << endl;
write(sockt, numberString.c_str(), sizeof numberString);
}
long receive(int sockt) {
// receive string
const unsigned int MAX_BUF_LENGTH = 1024;
std::vector<char> buffer(MAX_BUF_LENGTH);
std::string rcv;
recv(sockt, &buffer[0], buffer.size(), 0);
rcv.append(buffer.cbegin(), buffer.cend());
//convert string to long
string::size_type sz = 0;
long val = stoll(rcv, &sz, 0);
cout << "Received: " << val << endl;
return val;
}
Клиент выполняет ту же связь, но в обратном порядке:
void communicate(){
string number = receive(sockt);
string prime = receive(sockt);
// do stuff to the data
send(sockt, divisions);
send(sockt, val);
}
Проблема заключается в Сервер иногда (после более 100 раз зацикливания) не получает второе отправленное сообщение от клиента и зависает. Клиент никогда не испытывает проблем с получением сообщения от сервера, но сервер всегда зависает. Сервер печатает:
Sending: 344486269
Sending: 7
Received: 0
Затем не завершается, поэтому я знаю, что он ожидает второго значения, которое никогда не приходит. Клиент печатает:
Received: 344486269
Received: 7
Sending: 0
Sending: 344486269
Итак, я знаю, что клиент успешно выполняет свои команды send()
.
Что может быть причиной того, что сервер неправильно получил второе сообщение?