Существует ли способ сбросить сокет POSIX?

Если ваш приоритет - производительность, перейдите ко второму варианту, а если вас беспокоит размер, перейдите к первому.

В качестве альтернативы, вы можете пойти другим путем: создать одну таблицу в качестве таблицы истории и установить флаг как ложный для столбца «новая запись», а также сбросить все данные, которые уже отправлены в таблицу истории и новые данные (пока быть отправлено) в основной таблице с флагом «Новая запись» = true. Таким образом, вы можете сохранить свой первый подход.

37
задан Tall Jeff 13 May 2009 в 01:28
поделиться

4 ответа

For Unix-domain sockets, you can use fflush(), but I'm thinking you probably mean network sockets. There isn't really a concept of flushing those. The closest things are:

  1. At the end of your session, calling shutdown(sock, SHUT_WR) to close out writes on the socket.

  2. On TCP sockets, disabling the Nagle algorithm with sockopt TCP_NODELAY, which is generally a terrible idea that will not reliably do what you want, even if it seems to take care of it on initial investigation.

It's very likely that handling whatever issue is calling for a 'flush' at the user protocol level is going to be the right thing.

17
ответ дан 27 November 2019 в 04:47
поделиться

Я думаю, что это было бы чрезвычайно сложно, если вообще возможно, правильно реализовать. Что означает «промывка» в этом контексте? Байт передано в сеть? Байты подтверждены стеком TCP получателя? Байты переданы в приложение пользовательского режима получателя? Байт полностью обрабатывается приложением пользовательского режима?

Похоже, вам нужно сделать это на уровне приложения ...

1
ответ дан 27 November 2019 в 04:47
поделиться

В стандартном интерфейсе сокетов TCP / IP я не знаю никакого способа сбросить данные «на всем пути к удаленному концу» и гарантировать, что они действительно были подтверждены.

Вообще говоря, если вашему протоколу требуется передача данных "в реальном времени", обычно лучше всего установить setsockopt () из TCP_NODELAY . Это отключает алгоритм Нэгла в стеке протоколов, а write () или send () в сокете более напрямую сопоставляется с отправками в сеть .... вместо реализации задержек отправки, ожидающих, когда станут доступны другие байты, и использования всех Таймеры уровня TCP, определяющие, когда отправлять. ПРИМЕЧАНИЕ. Отключение Nagle не отключает скользящее окно TCP или что-то еще, поэтому это всегда безопасно ... но если вам не нужен " тогда, как правило, вам нужно вернуться к использованию UDP и создать свои собственные функции протокола на основе основных свойств отправки / получения UDP. Это очень распространено, когда у вашего протокола есть особые потребности, но не стоит недооценивать сложность того, чтобы сделать это хорошо и сделать все стабильным и функционально правильным во всех, кроме относительно простых, приложениях. В качестве отправной точки тщательное изучение конструктивных особенностей TCP прольет свет на многие вопросы, которые необходимо учитывать.

тогда, как правило, вам нужно вернуться к использованию UDP и создать свои собственные функции протокола на основе основных свойств отправки / получения UDP. Это очень распространено, когда у вашего протокола есть особые потребности, но не стоит недооценивать сложность того, чтобы сделать это хорошо и сделать все стабильным и функционально правильным во всех, кроме относительно простых, приложениях. В качестве отправной точки тщательное изучение конструктивных особенностей TCP прольет свет на многие вопросы, которые необходимо учитывать.

9
ответ дан 27 November 2019 в 04:47
поделиться

TCP обеспечивает доставку только с максимальной эффективностью, поэтому процесс передачи всех байтов с машины A является асинхронным, поскольку все байты были получены на машине B. Стек протоколов TCP / IP знает, из конечно, но я не знаю никакого способа опросить стек TCP, чтобы узнать, все ли отправленное было подтверждено.

Безусловно, самый простой способ решить этот вопрос - на уровне приложения . Откройте второй TCP-сокет, который действует как обратный канал, и пусть удаленный партнер отправит вам подтверждение, что он получил нужную информацию. Это будет стоить вдвое больше, но будет полностью портативным и сэкономит вам часы программирования.

0
ответ дан 27 November 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: