Терминология сокетов - что означает «блокировка»? - PullRequest
2 голосов
/ 21 апреля 2011

При программировании разговорных сокетов на C #, что означает термин блокировка?

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

Если клиент 1 подключится, и мне потребуется, скажем, 10 секунд для обработки их запроса, будет ли сокет заблокирован для вызова клиента 2 через 2 секунды? Или служба начнет обработку второго запроса в другом потоке?

Таким образом, мои клиенты могут ждать ответа, но я должен иметь возможность обрабатывать несколько запросов одновременно.

Ответы [ 6 ]

4 голосов
/ 21 апреля 2011

Блокировка означает, что выполняемый вами вызов (отправка / получение) не возвращается («блокирует») до тех пор, пока не завершится основная операция сокета.

Для чтения это означает, что до тех пор, пока не будут получены некоторые данные или сокетбыл закрыт.Для записи это означает, что все данные в буфере были отправлены.

Для работы с несколькими клиентами создайте новый поток для каждого клиента / передайте работу потоку в пуле потоков.

Подключенные сокеты TCP не могут быть общими, поэтому в любом случае это должен быть один сокет для каждого клиента.

0 голосов
/ 29 декабря 2014

Вы можете использовать функцию Socket.Select()

Select(IList checkRead, IList checkWrite, IList checkError, int microSeconds)

для проверки нескольких сокетов на предмет читабельности или возможности записи.Преимущество в том, что это просто.Это может быть сделано из одного потока, и вы можете указать, как долго вы хотите ждать, либо навсегда (-1 микросекунда), либо определенную продолжительность.И вам не нужно делать ваши сокеты асинхронными (т.е. блокировать их).

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

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

0 голосов
/ 21 апреля 2011

Чтобы ответить на ваш вопрос, блокировка в основном означает, что элемент управления остается в функции или блоке кода (например, readfile () в c ++), пока не вернется и не перейдет в код, следующий за этим блоком кода. Это может быть в однопоточном или многопоточном контексте. Хотя блокировка вызовов в однопоточном коде - это в основном рецепт катастрофы.

Решение:

Чтобы решить это в C #, вы можете просто использовать асинхронные методы, например, BeginInvoke () и EndInvoke () в контексте сокетов, которые не будут блокировать ваши вызовы. Это называется методом асинхронного программирования. Вы можете вызывать BeginInvoke () и EndInvoke () либо для делегата, либо для элемента управления, в зависимости от того, какой метод ASYNCHRONOUS вы используете для достижения этого.

0 голосов
/ 21 апреля 2011

Блокирующий вызов будет удерживать текущий исполняемый поток до завершения вызова.

Например, если вы хотите прочитать 10 байтов из сетевого потока, вызовите метод Read следующим образом

byte[] buf = new byte[10];
int bytesRead = stream.Read(buf, 0, buf.Length);

Текущий исполняемый поток блокирует вызов Read до тех пор, пока не будет прочитано 10 байт (или не истек срок чтения ReadTimeout).

Существуют асинхронные варианты чтения и записи для предотвращения блокировки текущего потока.Они следуют стандартному шаблону APM в .NET.Варианты Async предотвращают необходимость раздачи потока (который будет заблокирован) каждому клиенту, что повышает вашу масштабируемость.

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

0 голосов
/ 21 апреля 2011

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

0 голосов
/ 21 апреля 2011

Это означает, что вы не можете использовать сокет для чего-либо еще в текущем исполняющем потоке.

Это не имеет ничего общего со стороной зверя. Это означает, что поток останавливается, ожидая ответа от сокета.

Если вы не хотите, чтобы он приостанавливался, используйте асинхронные методы.

Подробнее: http://www.developerfusion.com/article/28/introduction-to-tcpip/8/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...