Асинхронный прием датаграмм на Socket - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, возникла проблемка, а именно почему то в асинхронном режиме данные на сокет не приходят. С отправкой все в порядке. Вот есть код:
public class ClientUDP
    {
        public event ByteReceiveEventHandler ByteReceive;
        public delegate void ByteReceiveEventHandler(byte[] data, int size);
        public event ErrorEventHandler Warning;
        public delegate void ErrorEventHandler();
 
        public Socket socket, listen;
        IPEndPoint listenEP;
        EndPoint remEP;
 
        public byte[] Buffer = new byte[257];
 
        private int buf_size = 256;
        public int BufferSize
        {
            get { return BufferSize; }
            set
            {
                Buffer = new Byte[value + 1];
                buf_size = value;
            }
        }
 
        public ClientUDP()
        {
        }
        public ClientUDP(string ip, int port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint tmp = new IPEndPoint(IPAddress.Parse(ip), port);
            remEP = (EndPoint)(tmp);
        }
        public void Bind(string ip, int port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint tmp = new IPEndPoint(IPAddress.Parse(ip), port);
            remEP = (EndPoint)(tmp);
 
        }
        public void Send(byte[] buffer)
        {
            socket.BeginSendTo(buffer, 0, buffer.Length, SocketFlags.None, remEP, new AsyncCallback(SendCallback), socket);
        }
        public void Listen(int port)
        {
            listen = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            listenEP = new IPEndPoint(IPAddress.Any, port);//слушаем 11000 порт
            listen.Bind(listenEP);
 
            EndPoint EP = new IPEndPoint(IPAddress.Any, 0);
 
            listen.BeginReceiveFrom(Buffer, 0, buf_size, SocketFlags.None,  ref EP, new AsyncCallback(ReceiveCallback), listen);
 
        }
 
        private void ReceiveCallback(IAsyncResult ar)
        {
            
                Socket tmp = (Socket)ar.AsyncState;
                int size = tmp.EndReceiveFrom(ar, ref remEP);
                if (size > 0)
                {
                    ByteReceive(Buffer, size);
                }
                listen.BeginReceiveFrom(Buffer, 0, buf_size, SocketFlags.None, ref remEP, new AsyncCallback(ReceiveCallback), listen);

        }
        private void SendCallback(IAsyncResult ar)
        {
                Socket tmp = (Socket)ar.AsyncState;
                tmp.EndSendTo(ar);
        }
    }
Все, проблема решена, я случайно ошибся с номером порта. Код полностью рабочий.

Решение задачи: «Асинхронный прием датаграмм на Socket»

textual
Листинг программы
 ByteReceive(Buffer, size);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5