Действительно ли возможно не послушать на сокете?

Вы знаете, что на этом этапе цепочка управляемых блоков Amazon находится в предварительном просмотре и доступна только в 1 регионе us-east-1. AWS разрешает использовать только одну сеть для каждой учетной записи AWS. Смотрите ограничения, выделенные AWS. известные-проблемы-ограничения

Availability is limited to us-east-1.
Hyperledger Fabric is the only supported blockchain framework.
The maximum number of networks per AWS account is 1.
The maximum number of networks that an AWS account can be a member of is 1.
The maximum number of members per network is 5.
The maximum number of peer nodes per member is 1.
Peer nodes are limited to the bc.t3.small instance type.

Вместо использования create-network (поскольку вы не можете создать более одной сети в одной учетной записи AWS), вам необходимо использовать команду create-member в AWS CLI. Вот ОПИСАНИЕ команды create-member.

NAME
       create-member -    
DESCRIPTION
       Creates a member within the blockchain network.
       See also: AWS API Documentation    
       See 'aws help' for descriptions of global parameters.    
SYNOPSIS
            create-member
          [--client-request-token ]
          --network-id 
          --member-configuration 
          [--cli-input-json ]
          [--generate-cli-skeleton ]    
OPTIONS
       --client-request-token (string)
          An idempotency token. Set to an arbitrary unique value.    
       --network-id (string)
          The unique identifier of the network in which the member is created.    
       --member-configuration (structure)
          Member configuration parameters.    
       Shorthand Syntax:    
          Name=string,Description=string,FrameworkConfiguration={Fabric={AdminUsername=string,AdminPassword=string}}    
       JSON Syntax:    
          {
            "Name": "string",
            "Description": "string",
            "FrameworkConfiguration": {
              "Fabric": {
                "AdminUsername": "string",
                "AdminPassword": "string"
              }
            }
          }    
       --cli-input-json  (string) Performs service operation based on the JSON
       string provided. The JSON string follows the format provided by  --gen-
       erate-cli-skeleton.  If  other  arguments  are  provided on the command
       line, the CLI values will override the JSON-provided values. It is  not
       possible to pass arbitrary binary values using a JSON-provided value as
       the string will be taken literally.    
       --generate-cli-skeleton (string) Prints a  JSON  skeleton  to  standard
       output without sending an API request. If provided with no value or the
       value input, prints a sample input JSON that can be used as an argument
       for  --cli-input-json.  If provided with the value output, it validates
       the command inputs and returns a sample output JSON for that command.    
       See 'aws help' for descriptions of global parameters.    
OUTPUT
       MemberId -> (string)
          The unique identifier of the member.

Кроме того, вы можете использовать панель управления управляемой цепочкой блоков aws, чтобы добавить участника в существующую сеть. Смотрите прикрепленный скриншот. enter image description here

12
задан Dave Cheney 2 October 2008 в 21:09
поделиться

9 ответов

Некоторые библиотеки сокета позволяют Вам конкретно отклонять входящие соединения. Например: CommonC GNU ++: Класс TCPsocket имеет метод отклонения.

Сокеты BSD не имеют этой функциональности. Можно принять соединение и затем сразу закрыть его при оставлении сокета открытым:

while (running) {

  int i32ConnectFD = accept(i32SocketFD, NULL, NULL);
  while (noConnectionsPlease) {
    shutdown(i32ConnectFD, 2);
    close(i32ConnectFD);
    break;
  }

}
4
ответ дан 2 December 2019 в 19:33
поделиться

На базовом уровне сокеты или открыты или закрываются (мы проигнорируем тонкости диаграммы состояний TCP/IP здесь).

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

У Вас есть два варианта, которые я вижу. Любое завершение () сокет, когда Вы хотите "не послушать", и вновь открыть его позже - Использование setsockopt () с флагом SO_REUSEADDR, чтобы позволить Вам снова переплетать к закрепленному порту перед TIME_WAIT2, истекает.

Другой выбор состоит в том, чтобы сохранить сокет открытым, но просто не принять () от него, в то время как Вы 'заняты'. Принятие Вас имеет прикладной уровень, подтверждают к запросам, Вы, подсистема балансировки нагрузки поняла бы, что это не получает ответ и действие соответственно.

0
ответ дан 2 December 2019 в 19:33
поделиться

Закройте его. Поскольку я вспоминаю;

close(fd);
4
ответ дан 2 December 2019 в 19:33
поделиться

После закрытия сокета Ваши программы могут все еще сказать Вам, что сокет используется, это из-за некоторого weirdiness, о котором я не знаю точно. Но страница справочника о сокетах показывает Вам существует флаг, чтобы снова использовать тот же сокет, лениво названный: "SO_REUSEADDR". Установите его с помощью "setsockopt ()".

5
ответ дан 2 December 2019 в 19:33
поделиться

Нет никакого явного метода для неслушания!

Вы можете также close(fd) или shutdown(fd, how)

fd is the socket file descriptor you want to shutdown, and how is one of the following:

0 Further receives are disallowed

1 Further sends are disallowed

2 Further sends and receives are disallowed (like close())
1
ответ дан 2 December 2019 в 19:33
поделиться

На основе Вашей отредактированной версии вопроса я не уверен, что необходимо "не послушать" или закрыться (). Две опции приходят на ум:

1) После вызова, слушают (), соединения на самом деле не приняты, до (достаточно логически) Вы звоните, принимают (). Можно "не послушать" путем простого игнорирования действия сокета, и задержка любого принимает (), пока Вы не готовы к ним. Любое входящее соединение делает попытку отставания на очередь, которая была создана, когда порт был открыт в режиме прослушивания. После того как неудовлетворенная очередь полна в стеке, дальнейшие попытки подключения просто отбрасываются на полу. То, когда Вы возобновляетесь с, принимает (), Вы быстро исключите отставание из очереди и будете готовы к большему количеству соединений.

2) Если Вы действительно хотите, чтобы порт казался полностью закрытым временно, Вы могли бы динамично применить фильтр пакетов уровня ядра к порту для препятствования попыткам входящего соединения достигнуть сетевого стека. Например, Вы могли использовать Фильтр пакетов Беркли (BPF) на большинстве *, отклоняют платформы. Это - Вы, хотят отбросить входящие пакеты, входящие к порту интереса, использующего функции брандмауэра платформы. Это, конечно, варьируется платформой, но является возможным подходом.

2
ответ дан 2 December 2019 в 19:33
поделиться

Вот довольно ужасный подход на основе Вашего отредактированного вопроса:

Откройте сокет для слушания с нормальным отставанием. Продолжить двигаться.

Когда Вы хотите "закрыть", открыть 2-й с отставанием 1 и SO_REUSEADDR. Закройте первый. Когда готовый для возобновления сделайте другой фокус сокета одному с нормальным отставанием.

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

0
ответ дан 2 December 2019 в 19:33
поделиться

Не думаю, что это хорошая идея, но ...

Вы могли бы позвонить послушать во второй раз. Спецификация POSIX не запрещает этого. Возможно, вы могли бы вызвать это второй раз с параметром невыполненной работы, равным 0, когда вы хотите «отменить прослушивание».

Что происходит при вызове listen с невыполненной работой, равной 0, похоже, определяется реализацией. В спецификации POSIX говорится, что может разрешить прием соединений, что подразумевает, что некоторые реализации могут отклонять все соединения, если параметр невыполненной работы равен 0. Однако более вероятно, что ваша реализация выберет некоторое положительное значение при передаче. 0 (возможно, 1 или SOMAXCONN).

0
ответ дан 2 December 2019 в 19:33
поделиться

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

Аналогично, все соединения, которые были в ожидании, когда вы закрыли прослушивающий сокет, будут закрыты без данных.

Если вы хотите подать сигнал вышестоящему балансировщику нагрузки, у вас должен быть протокол для этого. Не пытайтесь злоупотреблять TCP для этого.

К счастью, если клиентами являются обычные веб-браузеры, вам многое может сойти с рук - простое закрытие сокетов обычно приводит к их повторным попыткам прозрачно для пользователя (до определенного момента).

2
ответ дан 2 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

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