Итак, я пытаюсь сделать следующее: у меня есть два участника (назовем их A и B), которые общаются через сокет TCP (send () и recv ()). A отправляет счетчик и случайный Nonce, B просто отвечает тем же сообщением, которое получает. Затем A проверяет, соответствует ли ответ отправленному пакету, и если да, увеличивает счетчик и повторяет.
Это фрагмент кода, иллюстрирующий, что A делает в данный момент:
send(sock, payload, strlen(payload), 0);
struct timeval t_out;
t_out.tv_sec = 0;
t_out.tv_usec = 5000;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,&t_out,sizeof(t_out)) <0)
int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
if (len < 0)
{
print("Timeout reached, recv failed: errno %d", errno);
}
else
{
rx_buffer[len] = 0;
if(strncmp(rx_buffer, payload, payload_len) == 0)
{
pack_nr++;
}
}
Сейчас Я столкнулся с одной проблемой. Допустим, B по какой-то причине задерживается с ответом. Это вызывает что-то вроде этого:
- A отправляет что-то вроде "1xyz"
- B имеет задержку ......
- A время ожидания и что-то отправляет как "1ab c"
- Первый ответ B ("1xyz") достигает A, A решает, что это неправильная полезная нагрузка
- Второй ответ B ("1ab c") достигает A тоже, но A выполняет только один recv (), и пока его не видно
- A отправляет что-то вроде «1uvw»
- A читает «1ab c» из recv () и снова решает, что это неправильная полезная нагрузка
- Третий ответ B ("1uvw") достигает A, и так далее и так далее
Итак, я хотел бы поставить recv () в al oop, так что на шаге 5 A сначала будет искать другой ответ от B , пока не истечет время ожидания .
Так есть ли умный способ сделать это? Я думал о чем-то вроде
send(sock, payload, strlen(payload), 0);
int flag = 0;
gettimeofday(&start_time, NULL);
while((tx_time < start_time + timeout) && flag = 0)
{
gettimeofday(&tx_time, NULL);
recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
if(rx_buffer is okay)
{
flag = 1;
}
wait_a_bit();
}
if(flag == 1) pack_nr++;