Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / метод Accept / 8 сообщений из 8, страница 1 из 1
11.01.2011, 16:54
    #37052956
chelsicska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
Кто может помочь вот в вопросе связанном с методом Accept из класса Socket (язык C#).
Как я понимаю использование этого метода:
Создали сокет. Создали IPEndPoint (указав ip-адрес и порт). Далее вызываю метод Bind а потом Listen. После этого у меня сокет связался с локальной точкой, на которой началось прослушивание.

Далее (в отдельном методе) запускаю socketname.Accept(). И вот тут я не совсем точно понимаю (в МСДН не совсем понял). Получается, что когда я запустил метод Listen у меня где-то выделилась память, для включения в очередь входящих соединений от удаленных клиентов. При запуске метода Accept я вытаскиваю одно такое соединение (так как метод возвращает Socket). Если у меня прога работает в синхронном режиме, то с остальными очередями соединений я ничего не могу поделать, пока не разорву соединение с уже полученным сокетом. Таким образом, я из метода получаю Socket и уже из этого результат вытаскиваю все нужные мне данные (полученные данные и т.п.). Правильно я рассуждаю? Исправьте если что не так.

ТЕперь дальше, в инете много примеров с многопоточными серверами. Я хочу свой написать (не асинхронный а именно многопоточный). И я никак не могу понять следующее. Создать сокет для прослушки локальной точки - тут как бы все понятно, что эта фигня может использовать много раз. Но как мне на основе того, что метод Accept выдал сокет запустить новый поток, ведь Accept никакое событие не запускает или что-то похожее, чтобы я мог отловить для создания нового потока для работы с новым сокетом. Помогите разобраться.
...
Рейтинг: 0 / 0
11.01.2011, 17:14
    #37053022
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
chelsicska Но как мне на основе того, что метод Accept выдал сокет запустить новый поток, ведь Accept никакое событие не запускает или что-то похожее, чтобы я мог отловить для создания нового потока для работы с новым сокетом. Помогите разобраться.А в чем проблема? Получили сокет, запустили новый поток и в нем обрабатываете соединение.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            while (true)
            {
                //ожидаем подключения клиента
                Socket s = socket.Accept();
                //запускаем поток обработки подключенного клиента
                ThreadPool.QueueUserWorkItem(
                    (o) =>
                    {
                        //принимаем данные от клиента
                        byte[] buffer = new byte[1024];
                        int recived = s.Receive(buffer);
                        Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, recived));
                    });
            }
...
Рейтинг: 0 / 0
11.01.2011, 17:24
    #37053054
chelsicska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
Ну как раз пулами я запускать не хочу.
Мне просто не до конца понятен метод Accept.
При запуске этого метода ожидается подключение клиента.
К примеру я запускаю это ожидание в отдельном потоке:

public void Acp()
{
Socket newsock = oldsocket.Accept();
}

Thread t1 = new Thread(Acp);
t1.Start();


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

Мне бы удобнее было бы сделать следующее: при новом входящем соеднии метод Accept мне как-то говрил об этом сам, после этого на основе того что он сказал программ абудет решать создавать новый поток или нет. Но я никак не могу понять - как мне этот метод Accept заставить говорить мне о том, что поступило новое удаленное соединение.
...
Рейтинг: 0 / 0
11.01.2011, 17:47
    #37053116
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
chelsicskaВот для этого мне надо лучше знать метод Accept, а именно что происходит в нем, когда доступно новое удаленное соединение?

Мне бы удобнее было бы сделать следующее: при новом входящем соеднии метод Accept мне как-то говрил об этом сам, после этого на основе того что он сказал программ абудет решать создавать новый поток или нет. Но я никак не могу понять - как мне этот метод Accept заставить говорить мне о том, что поступило новое удаленное соединение.Accept - блокирующий метод. Ваша программа остановится на этой точке
Socket newsock = oldsocket.Accept();
до тех пор, пока не будет получен входящий коннект. Когда конект получен, метод Accept возвращает управление вашему потоку:

public void Acp()
{
Socket newsock = oldsocket.Accept();
//<------- сюда вы пападаете при получении конекта
}
...
Рейтинг: 0 / 0
11.01.2011, 17:57
    #37053140
chelsicska
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
То есть. Если у меня подключился клиент удаленно, то сокет (созданный для подключения к локальной точки и использующий методы Bind и Listen для прослушки) будет блокироваться, именно этот сокет? И если я правильно понял, то всю дальнейшую обработку данных (полученных или переданных от сокета) - всю обработку я веду с сокетом, который мне дал метод Accept, так (здравый смысл мне подсказывает что это так, так как суть этого метода выдавать входящие соединения от клиентов)?

То есть получается следующее. Я запускаю бесконечный цикл (while) - который постоянно запускает метод Accept, после этого (как только метод Accept выдал сокет, я запускаю новые потоки в этом бесконечном цикле для обработки входящих и исходящих данных (для удобства даю имена этим потокам, чтобы я точно знал в какой именно поток я отправляю данные, а отсюда я буду знать к какому клиенту я отправляю данные). Так?
Огромное тебе кстати спасибо, что уделил моей ветке время
...
Рейтинг: 0 / 0
11.01.2011, 18:01
    #37053146
Algol36
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
Да, именно так.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
14.09.2016, 07:21
    #39308761
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
подскажите когда метод Accept возвращает сокет, локальный порт этого соекта так же остается тот порт на который подключался клиент?
Или новому сокету система выдает новый порт?

посмотрел через LocalEndPoint, нового сокета, там указан слушающий порт, что меня немного удивило....
...
Рейтинг: 0 / 0
14.09.2016, 07:30
    #39308763
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
метод Accept
Все нормально. Для входящих соединений порт всегда один. ОС определяет в какой именно сокет пришли данные по адресу (IP:порт) второй стороны.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / метод Accept / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]