Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

Как прекратить Socket.Accept()

14.05.2013, 21:23. Показов 11363. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! В коде вызываю Socket.Accept() и, в некоторых ситуациях, его нужно прекратить, но если вызываю Socket.Close() - выбрасывается исключение. Что делать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2013, 21:23
Ответы с готовыми решениями:

Как прекратить выполнение асинхронного метода
Есть форма. По событию mouseUp исполняется следующий код: _isDragging = false; if (_isClickOnly) { ...

Как прекратить Session переменную?
Можно ли прекратить принудительно конкретную Session переменную? Например имеется SessionID: 5864221, как её прекратить?

Остановить socket.Accept() внутри блока while который находится внутри потока
Сам код using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

24
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
14.05.2013, 23:05
поймать исключение и заглушить
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
15.05.2013, 02:39  [ТС]
Неужели мелкософтовци ничего не придумали красивее?
0
21 / 20 / 3
Регистрация: 08.12.2012
Сообщений: 92
15.05.2013, 10:05
Socket.Disconnect() же
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
15.05.2013, 12:38  [ТС]
Цитата Сообщение от Crash94 Посмотреть сообщение
Socket.Disconnect()
Он тоже выбрасывает исключение.
0
21 / 20 / 3
Регистрация: 08.12.2012
Сообщений: 92
15.05.2013, 13:25
Цитата Сообщение от body90 Посмотреть сообщение
Он тоже выбрасывает исключение.
Очень странно... Сейчас пишу свой чат на сокетах, отсоединяюсь через Disconnect и ничего не выбрасывается. Может, вы случайно отсоединяете неподключенный сокет?
Может, так будет работать
C#
1
2
            
if(Socket.Connected)Socket.Disconnect(false);
Добавлено через 15 минут
А, это я не так понял вопрос.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
15.05.2013, 14:17  [ТС]
Цитата Сообщение от Crash94 Посмотреть сообщение
А, это я не так понял вопрос.
Да) Мне нужно не разорвать соединение, а завершить ожидание нового подключения.
0
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 13
26.02.2014, 13:03
Да у меня такая же хрень, процесс остаётся висеть.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
26.02.2014, 13:18  [ТС]
Вот именно. Я так и не нашел, как остановить ожидание подключения или входящих данных. Только таймаутом в цикле - но это же не есть гуд.
0
155 / 155 / 30
Регистрация: 19.10.2009
Сообщений: 319
26.02.2014, 14:16
Может, лучше проверять свойство Available, прежде чем делать Accept()? Типа если есть данные, то он не будет застревать на Accept'е, а если нет - вызывать Thread.Sleep на какое-то время и потом вновь проверять это свойство. А при каждом таком проходе можно и проверять тот факт, что нужно завершать процесс, а не ждать новых данных.

А события, к сожалению, здесь быт не может - winsock32.dll не имеет callback для socket'а о приходе новых данных.
1
99 / 39 / 12
Регистрация: 30.01.2011
Сообщений: 129
26.02.2014, 15:12
А почему, если не секрет не юзаете socket.BeginAccept()?
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
26.02.2014, 19:21  [ТС]
Цитата Сообщение от Ilya81 Посмотреть сообщение
Может, лучше проверять свойство Available, прежде чем делать Accept()? Типа если есть данные, то он не будет застревать на Accept'е, а если нет - вызывать Thread.Sleep на какое-то время и потом вновь проверять это свойство. А при каждом таком проходе можно и проверять тот факт, что нужно завершать процесс, а не ждать новых данных.
Available - количество данных в уже подключенном потоке, Accept - прием нового клиента в подключение. Какое отношение одного к другому?

Добавлено через 2 минуты
Цитата Сообщение от Martovskij Посмотреть сообщение
А почему, если не секрет не юзаете socket.BeginAccept()?
Лично у меня, кажется, был и так отдельный поток для этого. Да и проблемы это, наверное, не решает. Всё равно же его не отменить.
0
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 13
27.02.2014, 07:01
А этот вопрос решил только через
C#
1
2
socket.BeginAccept(new AsyncCallback(acceptCallBack), this);
            waitAccept.WaitOne();
1
155 / 155 / 30
Регистрация: 19.10.2009
Сообщений: 319
27.02.2014, 14:29
Может я перепутал свойство, но последний раз я эту вещь делал именно так - прежде, чем делать Accept, проверял, есть ли данные. Если есть, то он его быстро пройдёт, если нет - так незачем делать Accept раньше, чем появятся данные. В общем, рекомендую этот вариант. А если делать thread.Abort(), то при неблагоприятном стечении обстоятельств (милисекундой раньше - милисекундой позже, тут как повезёт) могут остаться занятые порты до перезагрузки Windows.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.02.2014, 20:22  [ТС]
Цитата Сообщение от Ilya81 Посмотреть сообщение
прежде, чем делать Accept, проверял, есть ли данные
Если клиент попытается приконнектиться, но на сервере не будет ожидать Accept, первый просто получит отказ на подключение, т.к. порт не прослушиватся. Не могу понять, какие данные можно проверить?
Может быть, Вы путаете Socket.Accept() с Socket.Receive()?
0
3 / 3 / 0
Регистрация: 08.04.2020
Сообщений: 6
27.08.2021, 21:59
Понимаю, что некрофилизм, но может пригодиться!

Добавлено через 8 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
ipPoint = new IPEndPoint(IPAddress.Parse(IpAddr), Port);
socket.Bind(ipPoint);
socket.Listen(Count);
 
while(true)
{
      if (socket.Poll(100,SelectMode.SelectRead))
      {
           Socket newSocket=socket.Accept();
      }
}
Добавлено через 1 минуту
Таким способом блокировки не происходит и цикл постоянно выполняется!
2
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
28.08.2021, 21:51

Не по теме:

Цитата Сообщение от zFire1982 Посмотреть сообщение
Понимаю, что некрофилизм, но может пригодиться!
ничего, сейчас за это накажем! XD


1. тема про завершение операции Accept без исключения, а не проблему блокировок
2. ваш код все также блокирующий и нужно выносить в отдельный поток
3. современный подход подразумевает async-await с отменой задачи. Хотя там ровно также сыпет исключение.
0
3 / 3 / 0
Регистрация: 08.04.2020
Сообщений: 6
06.09.2021, 15:20
Wolfdp,
1) Accept в данном случае блокирующая функция, которая отработает только при попытке соединения. При попытке закрыть вызовет ошибку. Так было и в самой библиотеке Winsock. При правильной логике вызов Accept происходит только в момент когда нужно. И проблема исчезает сама собой.

2) Простите, я не представляю как использовать серверный сокет с блокирующими функциями, не используя для него отдельного потока. И каким образом вы подразумеваете закрытие сокета если не использовать закрытие из другого потока?

3) Она и должна сыпать исключениями, т.к. при определенных условиях закрывая гнездо вы нарушаете логику работы. О чем система Вам сообщает.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.09.2021, 17:10
Цитата Сообщение от zFire1982 Посмотреть сообщение
При правильной логике вызов Accept происходит только в момент когда нужно.
Как определяется момент, что уже нужно вызывать?

Добавлено через 7 минут
Ага, понял, вопрос снимается.
Интересный вариант!
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.09.2021, 00:04
Цитата Сообщение от zFire1982 Посмотреть сообщение
При правильной логике вызов Accept происходит только в момент когда нужно.
А вот у меня вопрос остался. При таком подходе получаем либо System.ObjectDisposedException: Cannot access a disposed object. (который валит более стабильно), либо System.Net.Sockets.SocketException (10004): A blocking operation was interrupted by a call to WSACancelBlockingCall. (что даже немного озадачивает).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            var ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.3"), 12345);
            socket.Bind(ipPoint);
            socket.Listen(10);
 
            Task.Run(()=> 
            {
                try
                {
                    while (true)
                    {
                        if (socket.Poll(100, SelectMode.SelectRead))
                            _ = socket.Accept();
                    }
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                }
            });
 
            Thread.Sleep(10000);
            socket.Close();
            Console.WriteLine("closed");
            
            Console.ReadKey();
        }
Окей, если использовать не чистый сокет
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
            var ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.3"), 12345);
            var l = new TcpListener(ipPoint);
            l.Start();
            var f = true;
 
            Task.Run(()=> 
            {
                try
                {
                    while (f)
                    {
                        if (l.Server.Poll(100, SelectMode.SelectRead))
                            _ = l.Server.Accept();
                    }
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                }
                Console.WriteLine("stoped");
            });
 
            Thread.Sleep(10000);
            f = false;
            l.Stop();
            Console.WriteLine("closed");
            Console.ReadKey();
Либо закрывает без ошибок, либо таки валит SocketException (10004)

Окей, в процессе набора лапками вышеуказаного кода понял что можно сделать следующий финт ушами: устанавливаем флаг отмены, сначала глушим слушающий поток и только потом останавливаем саму прослушку.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        static void Main(string[] args)
        {
            var ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.3"), 12345);
            var l = new TcpListener(ipPoint);
            l.Start();
            var f = true;
            var stopedListening = new ManualResetEvent(false);
 
            Task.Run(async ()=> 
            {
                try
                {
                    while (f)
                    {
                        if (l.Server.Poll(100, SelectMode.SelectRead))
                            _ = await l.AcceptTcpClientAsync();
                    }
                    stopedListening.Set();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                }
                Console.WriteLine("stoped");
            });
 
            Thread.Sleep(10000);
            f = false;
            stopedListening.WaitOne();
            l.Stop();
            Console.WriteLine("closed");
            Console.ReadKey();
        }
p.s. у меня есть определенные сомнения насчет перфоменса, когда на сокет ломанется 100500 новых подключений. Мы вместо одного вызова Accept теперь делаем предварительный Poll. Насколько помню, сервер очень не шустро генерит новые подключения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2021, 00:04
Помогаю со студенческими работами здесь

После Socket.Accept() зависает приложение
После строки Socket.Accept() зависает приложение ,я знаю что этот метод останавливает выполнение кода пока он не выполнится ,как сделать...

Виснет socket.accept()
Ситуация такая. Есть небольшой веб сервер, который в несколько потоков слушает соединения на определенном порту. Логика работы потока...

Многопоточный socket accept
Идея запускать сервер на пару минут и потом останавливать. Принятие клиентов разделил на потоки, чтобы цыкл не останавливался на строчке...

Невозможно создать Socket: Socket sock = new Socket(someHostString,somePortInt);
Народ! Помогите пожалуйста. Вся красота губится на exception что выскакивает в момент создания сокета: Socket sock = new...

Как прекратить событие
Смысл в том, что при выполнении условия в 78 строке мне нужно чтобы событие FormKeyPress отключалось, как это реализовать? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru