Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407

Проверка Socket.Close();

15.05.2023, 16:56. Показов 1195. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две кнопки: start и stop, по первой начинаю прослушивание по udp, по второй прерываю его соответственно:
C#
1
udpSock.Close();
Все работает нормально до тех пор пока я во время прослушивания(после нажатия кнопки start) не нажму еще раз кнопку start.
При этом возникает следующее исключение: Перед этой операцией необходимо вызвать метод Bind.
В try catch не ловится, по этому нужно как-то проверять закрыт ли сокет, в обработчике кнопки start, вопрос собственно в том как это сделать? Пробовал udpSock.Connected, но это не работает...
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        private void button_Start_Click(object sender, RoutedEventArgs e)
        {
            Starter();
            viewModel.AddLineToСonsole("UDP сервер запущен...");
        }
 
        private void button_Stop_Click(object sender, RoutedEventArgs e)
        {
            udpSock.Close();
            viewModel.AddLineToСonsole("UDP сервер закрыт.");
        }
 
        public void Starter()
        {
            try
            {
                viewModel.ClearConsole();
                filePath = Environment.CurrentDirectory + "//" + "Data" + "//" + "" + DateTime.Now.ToString("HH_mm_ss") + ".bdi";
                udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                udpSock.Bind(new IPEndPoint(IPAddress.Any, 10100));
                buffer = new byte[1024];
                EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
                udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
        private void DoReceiveFrom(IAsyncResult iar)
        {
            try
            {
                Socket recvSock = (Socket)iar.AsyncState;
                EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
                int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP);
                byte[] localMsg = new byte[msgLen];
                Array.Copy(buffer, localMsg, msgLen);
                RecordAsync(localMsg, new Head(BitConverter.GetBytes((UInt16)(msgLen + 16)))).GetAwaiter();
                EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);
                udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);
 
                viewModel.AddLineToСonsole("Получено " +msgLen+ " байт с адреса "+((IPEndPoint)clientEP).Address+ ":"+((IPEndPoint)clientEP).Port+"");
 
                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    Scroller.ScrollToBottom();
                }));
            }
            catch (ObjectDisposedException)
            {
 
            }
        }
Добавлено через 13 минут
на null тоже проверял - не работает
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2023, 16:56
Ответы с готовыми решениями:

Socket.BeginConnect и чтение/запись данных - проверка кода
private void Connect() { String server = "192.168.10.100"; Int32 port = 6000; _socket =...

socket проверка кто блокирует\какой программой занят порт
Возник вопрос, возможно ли проверить кто блокирует\занимает порт имея IP и порт соотвественно. Может подскажите в какую сторону копать? ...

Close -> Hide
Доброе время суток! По условию программы когда нажимаеш на кнопку "Закрыть" (на бордере), программа должна не закрыватся, а сворачиватся...

12
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
15.05.2023, 20:51
Может вам добавить свой флаг - IsWorking. При нажатии повторно просто проверяете флаг:
C#
1
2
if (IsWorking)
    return;
Или у вас другая проблема?
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
16.05.2023, 09:19  [ТС]
IamRain, Так можно сделать, но хотелось бы какой-то более "чистый способ" через свойства сокета, если он есть конечно
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.05.2023, 11:00
Цитата Сообщение от firnen_dragon Посмотреть сообщение
Все работает нормально до тех пор пока я во время прослушивания(после нажатия кнопки start) не нажму еще раз кнопку start.
А зачем ее еще раз нажимать, если порт уже прослушивается?

И на всякий случай: почему используется асинхронная модель программирования (Asynchronous Programming Model, APM) вместо модели на основе задач (Task-based asynchronous pattern, TAP)?
Первая — легаси, вторая сильно проще.
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
16.05.2023, 11:24  [ТС]
kolorotur, пишу не себе, люди могут сломать все там, где нечего ломать, так что приходится обрабатывать все исключения.
На счет модели, разбирался в принципе с асинхронным udp, нашел такой способ, его и использую. Если есть альтернативные примеры решения подобной задачи, буду только рад их изучить.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
16.05.2023, 11:54
Лучший ответ Сообщение было отмечено firnen_dragon как решение

Решение

Цитата Сообщение от firnen_dragon Посмотреть сообщение
люди могут сломать все там, где нечего ломать
Так можно же просто кнопку запуска заблокировать после нажатия.
2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.05.2023, 12:01
Цитата Сообщение от firnen_dragon Посмотреть сообщение
люди могут сломать все там
Товарищ John Prick выше верно подметил: деактивируйте кнопку пока сокет открыт.
Как закрылся — активируйте.
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
16.05.2023, 12:03  [ТС]
John Prick, Хм, и действительно, об этом не подумал почему-то
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
16.05.2023, 12:22
firnen_dragon, касательно кода, вот пример с использованием TAP и UdpClient (C# 11, .NET 7):
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
34
35
36
37
38
39
40
41
42
43
private CancellationTokenSource? _cts;
 
private async void button_Start_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    button.Enabled = false;
 
    _cts = new();
    using var udp = new UdpClient(21190);
 
    try { await ProcessMessages(udp, _cts.Token); }
    finally { button.Enabled = true; }
}
 
private void button_Stop_Click(object sender, EventArgs e)
{
    _cts?.Cancel();
    _cts?.Dispose();
    _cts = null;
}
 
private async Task ProcessMessages(UdpClient udp, CancellationToken ct)
{
    await foreach (var message in ReceiveMessages(udp, ct))
    {
        var headLength = BitConverter.GetBytes((ushort)(message.Length + 16));
        await RecordAsync(message, new Head(headLength));
        Scroller.ScrollToBottom();
    }
}   
 
async IAsyncEnumerable<byte[]> ReceiveMessages(UdpClient udp, [EnumeratorCancellation] CancellationToken ct)
{
    UdpReceiveResult result;
    while (!ct.IsCancellationRequested)
    {
        try { result = await udp.ReceiveAsync(ct); }
        catch (OperationCanceledException) { yield break; }
 
        viewModel.AddLineToСonsole($"Получено {result.Buffer.Length} байт с адреса {result.RemoteEndPoint}");
        yield return result.Buffer;
    }
}
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
16.05.2023, 12:27  [ТС]
kolorotur, Спасибо большое, изучу
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
17.05.2023, 14:25
C#
1
2
_cts?.Cancel();
    _cts?.Dispose();
Я бьі сокет тоже грохал.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.05.2023, 16:25
Цитата Сообщение от Wolfdp Посмотреть сообщение
Я бьі сокет тоже грохал.
Он в месте создания грохнется:
Цитата Сообщение от kolorotur Посмотреть сообщение
using var udp = new UdpClient(21190);
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
17.05.2023, 17:38
kolorotur, а, точно -- не досмотрел. Ну и чуть привьік что на условном примере в stop грохается все и вся, но тут пример чуть проще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2023, 17:38
Помогаю со студенческими работами здесь

Socket.Close();
Допустим, у меня висит сервер, беспрерывно ожидающий подключения в отдельном потоке (Socket.BeginAccept) и тут его надо закрыть....

Чем отличаются this.Close() от Close()
this.Close(); Close(); как лучше? и какие ++ в использовании this? если работает одинакова?

Socket перенаправить в другой Socket
Доброго всем. Что делаю: Принимаю запрос, который нужно перенаправить к удаленному компьютеру. Получается прокси, который...

Close(); Dispose()
Подскажите, пожалуйста, имеет ли смысл вызывать и Close() и Dispose() по окончанию работы с потоком, например StreamWriter, StreamReader?

ContextMenuStrip on close
Пытаюсь сделать контекстное меню для datagridview, чтобы можно было скрывать столбцы. Не могу получить актуальное состояние отмеченных...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru