Нужна помощь с программой асинхронного сокета C #, которая имеет несколько отправок - PullRequest
0 голосов
/ 27 июля 2011

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

Я основал свою программу на программе чата, поэтому я использую эту часть для отправки несколькихстроки.

Итак, вот часть кода для Клиента:

private void Connect(IAsyncResult iar)
    {
        try
        {
            Socket client_conn = (Socket)iar.AsyncState;
            client_conn.EndConnect(iar);
            g_bmsg = new byte[1024];
            check = true;

            string szData = "@Player " + lblName.Text + " connected.";
            sendingFunction(szData);

            g_client_conn.BeginReceive(g_bmsg, 0, g_bmsg.Length, SocketFlags.None, new AsyncCallback(Receive), g_client_conn);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "GG");
        }
    }

    private void Send(IAsyncResult iar)
    {
        Socket client_conn = (Socket)iar.AsyncState;
        client_conn.EndSend(iar);
    }

    private void Receive(IAsyncResult iar)
    {
        if (g_bmsg.Length != 0)
        {
            SetLabelText(Encoding.ASCII.GetString(g_bmsg, 0, g_bmsg.Length));
            check = false;
        }
    }

    private void SetLabelText(string txt)
    {
        if (lblBuffer.InvokeRequired)
            lblBuffer.Invoke(new MethodInvoker(delegate { SetLabelText(txt); }));
        else
        {
            lblBuffer.Text = txt;
        }

        if (lblBuffer.Text.StartsWith("@"))
        {
            lblStatmsg.Text = lblBuffer.Text.Replace("@", "");
        }
        if (lblBuffer.Text.StartsWith("$"))
        {
            lblStatmsg.Text = "Server Settings Received.";
            lblBuffer.Text = lblBuffer.Text.Replace("$", "");
            option_Postn = int.Parse(lblBuffer.Text.Substring(0, 1));
            option_First = int.Parse(lblBuffer.Text.Substring(2, 1));
        }
        if (lblBuffer.Text.StartsWith("#"))
        {
            MessageBox.Show(lblBuffer.Text);
        }
    }

А вот часть кода для Сервера:

private void Accept(IAsyncResult iar)
    {
        Socket server_conn = (Socket)iar.AsyncState;

        g_server_conn = server_conn.EndAccept(iar);

        g_bmsg = new byte[1024];

        check = true;

        g_server_conn.BeginReceive(g_bmsg, 0, g_bmsg.Length, SocketFlags.None, new AsyncCallback(Recieve), g_server_conn);
    }

    private void Send(IAsyncResult iar)
    {
        Socket server_conn = (Socket)iar.AsyncState;

        server_conn.EndSend(iar);
    }

    private void Recieve(IAsyncResult iar)
    {
        try
        {
            Socket server_conn = (Socket)iar.AsyncState;

            server_conn.EndReceive(iar);

            if (g_bmsg.Length != 0)
            {
                SetLabelText(Encoding.ASCII.GetString(g_bmsg, 0, g_bmsg.Length));
                check = false;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "GG");
        }
    }

    private void SetLabelText(string txt)
    {
        if (lblBuffer.InvokeRequired)
            lblBuffer.Invoke(new MethodInvoker(delegate { SetLabelText(txt); }));
        else
        {
            lblBuffer.Text = txt;
        }

        if (lblBuffer.Text.StartsWith("@"))
        {
            lblStatmsg.Text = lblBuffer.Text.Replace("@", "");
        }
        else if (lblBuffer.Text.StartsWith("#"))
        {
            MessageBox.Show(lblBuffer.Text);
        }
        else if (lblBuffer.Text.StartsWith("%"))
        {
        }
    }

По сути, так какигра отправляет больше сообщений (она может отправлять настройки или игровые фрагменты и т. д.), я запускал функцию отправителя каждый раз, когда мне нужно что-то отправить, а с другой стороны, получатель декодирует отправленную строку на основе первого символа (@означает, что строка является настройкой, например).

Проблема в том, что после того, как хост и клиент в первый раз отправили что-то друг другу, они, похоже, не могут отправить снова.Нет ошибок, нет сообщений, нет ничего.Просто не пришлю.Что-то не так с функцией отправки?Или, может быть, делегат что-то?Я не знаю.Некоторые советы будут оценены, ребята.И заранее спасибо.

1 Ответ

3 голосов
/ 27 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...