сеть и многопоток
От: vvv848165@ya.ru  
Дата: 09.10.19 11:00
Оценка:
смотрел пример на msdn-е
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example

Что-то не понял назначение allDone сообщения (как я подумал оно вобще для красоты).
Раскожите для чего? ... неужели слушать в многопотоке нельзя?

А Socket.BeginSend и Send потокобезопастны? то-есть можно ли одному экземпляру Socket вызывать из разных потоков одновременно эти методы (Выполниться поочерёдно?)?

заранее спасибо!
Re: сеть и многопоток
От: hi_octane Беларусь  
Дата: 09.10.19 11:22
Оценка: 3 (1)
VYR>смотрел пример на msdn-е
VYR>https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example

Там в коде AsyncCallback и IAsyncResult — пример устарел лет на десять, и нужен только если у тебя остался махровый легаси. Современный .NET заточен под работу с async/await и System.IO.Pipelines.
Re: сеть и многопоток
От: RushDevion Россия  
Дата: 09.10.19 12:26
Оценка: 3 (1)
VYR>Что-то не понял назначение allDone сообщения (как я подумал оно вобще для красоты).
VYR>Раскожите для чего? ... неужели слушать в многопотоке нельзя?

Что значит "слушать в многопотоке" я не знаю.
Но стандартный паттерн в Asynchronous Programming Model (это как раз Begin/End) был такой:
1. Вызвать BeginAccept (вызывающий поток не блокируется),
2. В обработчике колбека первым делом снова вызвать BeginAccept (поток не блокируется)
3. Продолжить обработку входящего сокета.

В примере пошли немного другим путем и разделили обязанности.
Основной поток отвечает за исключительно за Accept, а отдельные потоки — исключительно за обработку каждого из входящих сокетов.
А allDone — способ синхронизации между ними.
После того, как Accept случился, обработчик запроса просто сигналит в основной поток: хей друг, есть Accept, я его буду дальше обрабатывать, а ты можешь снова вызывать BeginAccept.
Потому что, если в основном потоке вызывать BeginAccept в бесконечном цикле, ничем хорошим это не кончится.

VYR>А Socket.BeginSend и Send потокобезопастны? то-есть можно ли одному экземпляру Socket вызывать из разных потоков одновременно эти методы (Выполниться поочерёдно?)?

Согласно документации да.
Re: сеть и многопоток
От: Ночной Смотрящий Россия  
Дата: 09.10.19 13:34
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>смотрел пример на msdn-е

VYR>https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example

Пример древний как навоз мамонта. Как минимум не стоит использовать методы Begin/EndXxx

VYR>Что-то не понял назначение allDone сообщения (как я подумал оно вобще для красоты).


Это не сообщение, а событие. Нужно для того чтобы

VYR>Раскожите для чего? ... неужели слушать в многопотоке нельзя?


Your callback method should invoke the EndAccept method. When your application calls BeginAccept, the system usually uses a separate thread to execute the specified callback method and blocks on EndAccept until a pending connection is retrieved. EndAccept will return a new Socket object that you can use to send and receive data with the remote host. You cannot use this returned Socket to accept any additional connections from the connection queue. If you want the original thread to block after you call the BeginAccept method, use WaitHandle.WaitOne. Call the Set method on a ManualResetEvent in the callback method when you want the original thread to continue executing.

... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: сеть и многопоток
От: vvv848165@ya.ru  
Дата: 10.10.19 05:47
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Пример древний как навоз мамонта. Как минимум не стоит использовать методы Begin/EndXxx


а какой посвежее — не могу найти — (но так чтобы для сервера с большим количеством соединений подошло)?
Re[3]: сеть и многопоток
От: Ночной Смотрящий Россия  
Дата: 10.10.19 07:51
Оценка: 10 (2)
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>а какой посвежее — не могу найти — (но так чтобы для сервера с большим количеством соединений подошло)?


Первое что нагуглилось
https://codereview.stackexchange.com/a/31149
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.