Как использовать EndReceiveFrom без возврата значения asynResult - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь создать простое приложение для чата в c #, и я хочу, чтобы программа сервера могла начинать и прекращать прослушивание клиентов, пытающихся подключиться. Я использую BeginRecieveFrom для начала прослушивания, но я хочу иметь возможность остановить прослушивание при нажатии на кнопку. Я предполагаю, что я должен использовать EndRecieveFrom для этого, но после тщательного поиска в Google я все еще не уверен, как работает параметр IAsyncResult. Мне не нужно возвращаемое значение, я просто хочу, чтобы сервер прекратил слушать.

Я попытался установить значение IAsyncResult на ноль, но это не сработало.

namespace ChatServer
{
    public partial class Server : Form
    {
        #region Private Members

        // Structure to store the client information
        private struct Client
        {
            public EndPoint endPoint;
            public string name;
        }

        // Listing of clients
        private ArrayList clientList;

        // Server socket
        private Socket serverSocket;

        // Data stream
        private byte[] dataStream = new byte[1024];

        // Status delegate
        private delegate void UpdateStatusDelegate(string status);
        private UpdateStatusDelegate updateStatusDelegate = null;

        #endregion

        #region Constructor

        public Server()
        {
            InitializeComponent();
        }

        #endregion

        #region Events


        private void Server_Load(object sender, EventArgs e)
        {
            try
            {
                // Initialise the ArrayList of connected clients
                this.clientList = new ArrayList();

                // Initialise the delegate which updates the status
                this.updateStatusDelegate = new UpdateStatusDelegate(this.UpdateStatus);

                // Initialise the socket
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                // Initialise the IPEndPoint for the server and listen on port 30000
                IPEndPoint server = new IPEndPoint(IPAddress.Any, 30000);

                // Associate the socket with this IP address and port
                serverSocket.Bind(server);

            }
            catch (Exception ex)
            {
                lblStatus.Text = "Error";
                MessageBox.Show("Load Error: " + ex.Message, "UDP Server", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
            EndPoint epSender = (EndPoint)clients;
            serverSocket.BeginReceiveFrom(this.dataStream, 0, this.dataStream.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveData), epSender);

            lblStatus.Text = "Listening";
            btnStart.Click -= new EventHandler(btnStart_Click);
            btnStart.Text = "Stop Listening";
            btnStart.Click += new EventHandler(btnStart_Click2);
        }
        private void btnStart_Click2(object sender, EventArgs e)
        {
            IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
            EndPoint epSender = (EndPoint)clients;
            serverSocket.EndReceiveFrom(true, ref epSender);

            lblStatus.Text = "Not Listening";
            btnStart.Click -= new EventHandler(btnStart_Click2);
            btnStart.Text = "Start Listening";
            btnStart.Click += new EventHandler(btnStart_Click);
        }
    }
}                              
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...