|
метод Accept
|
|||
---|---|---|---|
#18+
Кто может помочь вот в вопросе связанном с методом Accept из класса Socket (язык C#). Как я понимаю использование этого метода: Создали сокет. Создали IPEndPoint (указав ip-адрес и порт). Далее вызываю метод Bind а потом Listen. После этого у меня сокет связался с локальной точкой, на которой началось прослушивание. Далее (в отдельном методе) запускаю socketname.Accept(). И вот тут я не совсем точно понимаю (в МСДН не совсем понял). Получается, что когда я запустил метод Listen у меня где-то выделилась память, для включения в очередь входящих соединений от удаленных клиентов. При запуске метода Accept я вытаскиваю одно такое соединение (так как метод возвращает Socket). Если у меня прога работает в синхронном режиме, то с остальными очередями соединений я ничего не могу поделать, пока не разорву соединение с уже полученным сокетом. Таким образом, я из метода получаю Socket и уже из этого результат вытаскиваю все нужные мне данные (полученные данные и т.п.). Правильно я рассуждаю? Исправьте если что не так. ТЕперь дальше, в инете много примеров с многопоточными серверами. Я хочу свой написать (не асинхронный а именно многопоточный). И я никак не могу понять следующее. Создать сокет для прослушки локальной точки - тут как бы все понятно, что эта фигня может использовать много раз. Но как мне на основе того, что метод Accept выдал сокет запустить новый поток, ведь Accept никакое событие не запускает или что-то похожее, чтобы я мог отловить для создания нового потока для работы с новым сокетом. Помогите разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2011, 16:54 |
|
метод Accept
|
|||
---|---|---|---|
#18+
chelsicska Но как мне на основе того, что метод Accept выдал сокет запустить новый поток, ведь Accept никакое событие не запускает или что-то похожее, чтобы я мог отловить для создания нового потока для работы с новым сокетом. Помогите разобраться.А в чем проблема? Получили сокет, запустили новый поток и в нем обрабатываете соединение. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2011, 17:14 |
|
метод Accept
|
|||
---|---|---|---|
#18+
Ну как раз пулами я запускать не хочу. Мне просто не до конца понятен метод Accept. При запуске этого метода ожидается подключение клиента. К примеру я запускаю это ожидание в отдельном потоке: public void Acp() { Socket newsock = oldsocket.Accept(); } Thread t1 = new Thread(Acp); t1.Start(); Тут многие детали упущены - но это не суть важно. Тут как бы видна моя мысль - в отдельном потоке я запускаю сокет на прослушку локальной точки на входящие соединения. Так как метод запущен, то как минимум одно соединение я получу. А как мне тогда получить второе соединение? Вот для этого мне надо лучше знать метод Accept, а именно что происходит в нем, когда доступно новое удаленное соединение? Мне бы удобнее было бы сделать следующее: при новом входящем соеднии метод Accept мне как-то говрил об этом сам, после этого на основе того что он сказал программ абудет решать создавать новый поток или нет. Но я никак не могу понять - как мне этот метод Accept заставить говорить мне о том, что поступило новое удаленное соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2011, 17:24 |
|
метод Accept
|
|||
---|---|---|---|
#18+
chelsicskaВот для этого мне надо лучше знать метод Accept, а именно что происходит в нем, когда доступно новое удаленное соединение? Мне бы удобнее было бы сделать следующее: при новом входящем соеднии метод Accept мне как-то говрил об этом сам, после этого на основе того что он сказал программ абудет решать создавать новый поток или нет. Но я никак не могу понять - как мне этот метод Accept заставить говорить мне о том, что поступило новое удаленное соединение.Accept - блокирующий метод. Ваша программа остановится на этой точке Socket newsock = oldsocket.Accept(); до тех пор, пока не будет получен входящий коннект. Когда конект получен, метод Accept возвращает управление вашему потоку: public void Acp() { Socket newsock = oldsocket.Accept(); //<------- сюда вы пападаете при получении конекта } ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2011, 17:47 |
|
метод Accept
|
|||
---|---|---|---|
#18+
То есть. Если у меня подключился клиент удаленно, то сокет (созданный для подключения к локальной точки и использующий методы Bind и Listen для прослушки) будет блокироваться, именно этот сокет? И если я правильно понял, то всю дальнейшую обработку данных (полученных или переданных от сокета) - всю обработку я веду с сокетом, который мне дал метод Accept, так (здравый смысл мне подсказывает что это так, так как суть этого метода выдавать входящие соединения от клиентов)? То есть получается следующее. Я запускаю бесконечный цикл (while) - который постоянно запускает метод Accept, после этого (как только метод Accept выдал сокет, я запускаю новые потоки в этом бесконечном цикле для обработки входящих и исходящих данных (для удобства даю имена этим потокам, чтобы я точно знал в какой именно поток я отправляю данные, а отсюда я буду знать к какому клиенту я отправляю данные). Так? Огромное тебе кстати спасибо, что уделил моей ветке время ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2011, 17:57 |
|
метод Accept
|
|||
---|---|---|---|
#18+
подскажите когда метод Accept возвращает сокет, локальный порт этого соекта так же остается тот порт на который подключался клиент? Или новому сокету система выдает новый порт? посмотрел через LocalEndPoint, нового сокета, там указан слушающий порт, что меня немного удивило.... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2016, 07:21 |
|
|
start [/forum/topic.php?fid=20&msg=37053116&tid=1400353]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
65ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 184ms |
0 / 0 |