需要关于具有多个发送的C#异步套接字程序的帮助吗

需要关于具有多个发送的C#异步套接字程序的帮助吗,c#,asynchronous,C#,Asynchronous,所以,我有一个棋盘游戏,它使用异步套接字在局域网上运行。问题是,我对异步套接字编程或线程几乎没有了解,但我尽力尝试 我的程序基于聊天程序,因此我使用该部分发送多个字符串 下面是客户端的部分代码: private void Connect(IAsyncResult iar) { try { Socket client_conn = (Socket)iar.AsyncState; client_conn.EndC

所以,我有一个棋盘游戏,它使用异步套接字在局域网上运行。问题是,我对异步套接字编程或线程几乎没有了解,但我尽力尝试

我的程序基于聊天程序,因此我使用该部分发送多个字符串

下面是客户端的部分代码:

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("%"))
        {
        }
    }
基本上,由于游戏发送的信息不止一条(它可以发送设置或游戏片段等),因此每当我需要发送内容时,我都会运行sender函数,而另一方面,接收方会根据第一个字符对发送的字符串进行解码(@表示该字符串是一个设置,例如)


问题是,在主机和客户端第一次互相发送内容后,它们似乎无法再次发送。没有错误,没有消息,什么都没有。只是不愿意送。发送功能是否有问题?或者代表什么的?我不知道。各位,请给我一些建议。提前谢谢。

你再也不会给BeginReceive打电话了。异步套接字编程的典型实践是处理接收到的数据,然后再次调用
BeginReceive
,这样您就可以处理下一个输入的数据位。

您再也不会调用
BeginReceive
。异步套接字编程的典型做法是处理接收到的数据,然后再次调用
BeginReceive
,这样您就可以处理下一个输入的数据位。

那么,我可以将其添加到sendingFunction()中,还是会毁了什么?不管怎样,谢谢你的回答。那么,我能把它添加到我的sendingFunction()中吗?否则会毁了什么吗?无论如何,谢谢你的回答。