Блокировка TCP-отправки до возврата ACK - PullRequest
0 голосов
/ 24 августа 2011

Я программирую клиентское приложение, отправляющее пакеты TCP / IP на сервер.Из-за проблем с тайм-аутом я хочу запустить таймер, как только будет возвращен ACK-пакет (поэтому тайм-аут не может быть, пока пакет не достиг сервера).Я хочу использовать winapi.

Установка сокета в режим блокировки не помогает, потому что команда send возвращается, как только данные записываются в буфер (если я не ошибаюсь).Есть ли способ заблокировать отправку до тех пор, пока не будет возвращено ACK, или есть другой способ сделать это без написания собственной реализации TCP?

С уважением

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

peudocode ... будет ждать, пока ack будет получен, после чего вы сможете вызывать любую функцию, какую захотите, - я выбрал некоторую составную функцию send_data .., которая затем отправит информацию через сокет после получения ack.

data = ''
while True
    readable, writable, errors = select([socket])
        if socket in readble
            data += recv(socket)
            if is_ack(data)
                timer.start() #not sure why you want this
                break
send_data(socket)
0 голосов
/ 24 августа 2011

Похоже, вы хотите выполнить минимальную реализацию для достижения своей цели. В этом случае вы должны установить свой сокет на блокировку, и после отправки, которая блокирует, пока все данные не будут отправлены, вы вызываете recv, который, в свою очередь, будет блокировать до тех пор, пока не будет получен пакет ACK, или конец сервера не закроет или не прервет соединение.

Если вы хотите пойти дальше со своей реализацией, вам придется структурировать клиентское приложение таким образом, чтобы поддерживать асинхронную связь. Есть несколько методов с различной степенью сложности; опрос с использованием select () простой, модель событий с использованием WSASelectEvent / WSAWaitForMultipleEvents сложная, а модель IOCompletionPort очень сложная.

...