Гость
Map
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получить данные по UDP сокет. / 17 сообщений из 17, страница 1 из 1
04.07.2021, 12:58
    #40081602
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
Нашел вот такой симпатичный класс.

Код: 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.
55.
56.
57.
58.
 public  class UDPSocket
    {
        private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        private const int bufSize = 8 * 1024;
        private State state = new State();
        private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
        private AsyncCallback recv = null;

        public class State
        {
            public byte[] buffer = new byte[bufSize];
        }

        public void ServerStart(string address, int port)
        {
            _socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
            _socket.Bind(new IPEndPoint(IPAddress.Parse(address), port));
            Receive();
        }

        public void ServerStop(bool reuse_socket)
        {
            _socket.Disconnect(reuse_socket);
        }

        public void ClientConnect(string address, int port)
        {
            _socket.Connect(IPAddress.Parse(address), port);
            Receive();
        }

        public void ClientDisconnect(bool reuse_socket)
        {
            _socket.Disconnect(reuse_socket);
        }

        public void Send(string text)
        {
            byte[] data = Encoding.ASCII.GetBytes(text);
            _socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
            {
                State so = (State)ar.AsyncState;
                int bytes = _socket.EndSend(ar);
                Console.WriteLine("SEND: {0}, {1}", bytes, text);
            }, state);
        }

        private void Receive()
        {
            _socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
            {
                State so = (State)ar.AsyncState;
                int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
                _socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
                Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
            }, state);
        }
    }




Открываю сервер
Код: c#
1.
2.
UDPSocket s = new UDPSocket();
s.ServerStart(TextBoxIP.Text, port);


А как я получаю данные? Явного метода в классе нет, или я что то не понимаю?
...
Рейтинг: 0 / 0
04.07.2021, 17:35
    #40081633
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
начни с изучения литературы. её мегатонны на просторах интырнета
...
Рейтинг: 0 / 0
04.07.2021, 17:36
    #40081635
love_bach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
и не ищи "симпотичных" классов. пользуйся чем-то стандартным
...
Рейтинг: 0 / 0
05.07.2021, 08:17
    #40081701
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
love_bach
и не ищи "симпотичных" классов. пользуйся чем-то стандартным

чем например? и чем мой пример нестандартен?
...
Рейтинг: 0 / 0
05.07.2021, 09:33
    #40081710
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
jenya7
love_bach
и не ищи "симпотичных" классов. пользуйся чем-то стандартным

чем например? и чем мой пример нестандартен?

Тем что ты нашел какой-то код без документации и примеров использования и наивно думаешь что другие захотят в нем ковыряться чтобы тебя научить им пользоваться.

Погугли другие примеры, в инете их полно. Вот например
...
Рейтинг: 0 / 0
05.07.2021, 09:52
    #40081713
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
Dima T
jenya7
пропущено...

чем например? и чем мой пример нестандартен?

Тем что ты нашел какой-то код без документации и примеров использования и наивно думаешь что другие захотят в нем ковыряться чтобы тебя научить им пользоваться.

Погугли другие примеры, в инете их полно. Вот например

спасибо.
я создал сокет
Код: c#
1.
2.
3.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
socket.Bind(localIP);


Дальше начинаются проблемы - SendTo() - мастер не знает IP удаленных машин. пробовал так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void Send(string str)
{
     //IPEndPoint sender = new IPEndPoint(IPAddress.Any, port); - получаю exception

     IPEndPoint sender = new IPEndPoint(IPAddress.Broadcast, port); //нет exception но никто не получает

     byte[] send_bytes = Encoding.ASCII.GetBytes(str);
     socket.Send(send_bytes, send_bytes.Length, sender);
}


То же самое с ReceiveFrom() - я не знаю какой IP пришлет сообщение. я должен получить сообщение от всех машин в локальной сети.
...
Рейтинг: 0 / 0
05.07.2021, 10:17
    #40081722
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
jenya7
я создал сокет
Код: c#
1.
2.
3.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
socket.Bind(localIP);


Ты создал сокет на локальном интерфейсе 127.0.0.1, через него могут обмениваться только приложения запущенные на одном компе.
Надо на всех интерфейсах создавать. Попробуй так
Код: c#
1.
IPEndPoint localIP = new IPEndPoint(IPAddress.Any, 5555);


И учти что при первом запуске выйдет окошко брандмауэра виндавса и попросит пользователя разрешить твоему приложению работать с сетью, если запретишь, то этот комп не сможет ни отправить, ни принять. При этом никаких ошибок не будет.
...
Рейтинг: 0 / 0
05.07.2021, 10:21
    #40081724
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
Dima T
jenya7
я создал сокет
Код: c#
1.
2.
3.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
socket.Bind(localIP);


Ты создал сокет на локальном интерфейсе 127.0.0.1, через него могут обмениваться только приложения запущенные на одном компе.
Надо на всех интерфейсах создавать. Попробуй так
Код: c#
1.
IPEndPoint localIP = new IPEndPoint(IPAddress.Any, 5555);


И учти что при первом запуске выйдет окошко брандмауэра виндавса и попросит пользователя разрешить твоему приложению работать с сетью, если запретишь, то этот комп не сможет ни отправить, ни принять. При этом никаких ошибок не будет.

А как я сделаю байнд с IPAddress.Any? я же должен привязать к своему IP.
у меня все машины подключены к общему AP. AP выдал им всем IP адреса.
...
Рейтинг: 0 / 0
05.07.2021, 10:25
    #40081727
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
на своей машине нет проблем я знаю свой IP. при посылке мне нужен IPAddress.Any но я получаю исключение.
...
Рейтинг: 0 / 0
05.07.2021, 10:39
    #40081733
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
jenya7
Dima T
пропущено...

Ты создал сокет на локальном интерфейсе 127.0.0.1, через него могут обмениваться только приложения запущенные на одном компе.
Надо на всех интерфейсах создавать. Попробуй так
Код: c#
1.
IPEndPoint localIP = new IPEndPoint(IPAddress.Any, 5555);


И учти что при первом запуске выйдет окошко брандмауэра виндавса и попросит пользователя разрешить твоему приложению работать с сетью, если запретишь, то этот комп не сможет ни отправить, ни принять. При этом никаких ошибок не будет.

А как я сделаю байнд с IPAddress.Any? я же должен привязать к своему IP.
у меня все машины подключены к общему AP. AP выдал им всем IP адреса.

Это и есть твой IP. IP это адрес сетевого интерфейса . На компе интерфейсов может быть сколько угодно. Передавая IPAddress.Any в Bind() ты сообщаешь что надо открыть порт на всех интерфейсах этого компа .

127.0.0.1 это специальный локальный интерфейс ( localhost ), он доступен только в пределах одного компа. Типа внутренняя сеть для приложений на одном компе.
...
Рейтинг: 0 / 0
05.07.2021, 10:43
    #40081735
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
jenya7
на своей машине нет проблем я знаю свой IP. при посылке мне нужен IPAddress.Any но я получаю исключение.

Потому что при отправке надо указывать IPAddress.Broadcast.

Сеть локальная? Широковещательные отправки за роутер не пройдут.
...
Рейтинг: 0 / 0
05.07.2021, 10:47
    #40081736
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
Dima T

Это и есть твой IP. IP это адрес сетевого интерфейса . На компе интерфейсов может быть сколько угодно. Передавая IPAddress.Any в Bind() ты сообщаешь что надо открыть порт на всех интерфейсах этого компа .

Понял. Но тут как раз проблемы нет. Меня устраивает привязка к моему IP. Мне при посылке надо послать всем. типа IPAddress.Broadcast но он не работает. или IPAddress.Any нужен чтоб принимать сообщения от всех?
...
Рейтинг: 0 / 0
05.07.2021, 11:44
    #40081756
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
jenya7
Dima T

Это и есть твой IP. IP это адрес сетевого интерфейса . На компе интерфейсов может быть сколько угодно. Передавая IPAddress.Any в Bind() ты сообщаешь что надо открыть порт на всех интерфейсах этого компа .

Понял. Но тут как раз проблемы нет. Меня устраивает привязка к моему IP. Мне при посылке надо послать всем. типа IPAddress.Broadcast но он не работает. или IPAddress.Any нужен чтоб принимать сообщения от всех?

У тебя нет привязки к твоему IP, ты НЕ отправляешь в сеть ничего!

Если тебя устраивает твой IP, то его и пиши вместо 127.0.0.1.
...
Рейтинг: 0 / 0
05.07.2021, 11:58
    #40081766
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
У тебя как минимум два интерфейса: локальный 127.0.0.1 и сетевой, например 192.168.0.102.

Объясняю на пальцах как оно работает: ты находишься в комнате (комп) с двумя дверьми (сетевые интерфейсы): на кухню (127.0.0.1), в коридор (192.168.0.102). Ты открываешь (bind()) дверь на кухню и показываешь (SendTo()) туда плакат с текстом. И задаешь вопрос: почему в коридоре плакат не видно? Дошло что ты не в тот интерфейс отправляешь?

Надо или указывать правильный интерфейс (твой IP в локалке), или открывать порт сразу на всех интерфейсах (IPAddress.Any)
...
Рейтинг: 0 / 0
05.07.2021, 12:05
    #40081770
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
Dima T
У тебя как минимум два интерфейса: локальный 127.0.0.1 и сетевой, например 192.168.0.102.

Объясняю на пальцах как оно работает: ты находишься в комнате (комп) с двумя дверьми (сетевые интерфейсы): на кухню (127.0.0.1), в коридор (192.168.0.102). Ты открываешь (bind()) дверь на кухню и показываешь (SendTo()) туда плакат с текстом. И задаешь вопрос: почему в коридоре плакат не видно? Дошло что ты не в тот интерфейс отправляешь?

Надо или указывать правильный интерфейс (твой IP в локалке), или открывать порт сразу на всех интерфейсах (IPAddress.Any)

я открыл порт на IP который выделил мне AP. а как послать сообщение всем? и как принять сообщение от других машин в сети если они не знают мой IP ?
...
Рейтинг: 0 / 0
05.07.2021, 12:20
    #40081774
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
jenya7
Dima T
У тебя как минимум два интерфейса: локальный 127.0.0.1 и сетевой, например 192.168.0.102.

Объясняю на пальцах как оно работает: ты находишься в комнате (комп) с двумя дверьми (сетевые интерфейсы): на кухню (127.0.0.1), в коридор (192.168.0.102). Ты открываешь (bind()) дверь на кухню и показываешь (SendTo()) туда плакат с текстом. И задаешь вопрос: почему в коридоре плакат не видно? Дошло что ты не в тот интерфейс отправляешь?

Надо или указывать правильный интерфейс (твой IP в локалке), или открывать порт сразу на всех интерфейсах (IPAddress.Any)

я открыл порт на IP который выделил мне AP. а как послать сообщение всем? и как принять сообщение от других машин в сети если они не знают мой IP ?

AP это что? В твоем примере 127.0.0.1 указано 22343502

Для начала разберись как послать на IP:порт другого компа, добейся чтобы доходило. Затем усложняй задачу до широковещательной рассылки. Как уже написал проблемы могут быть с настройкой сети, тупо брандмауэр получателя не пропускает.
...
Рейтинг: 0 / 0
05.07.2021, 12:28
    #40081777
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные по UDP сокет.
AP - access point
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получить данные по UDP сокет. / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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