C# 从一个套接字向两个回调发送数据

C# 从一个套接字向两个回调发送数据,c#,sockets,C#,Sockets,我正在制作两个可以相互通信的Windows窗体应用程序。我让他们互相交流,并在他们之间进行数据加密和解密。但现在我需要让他们用Deffie-Hellman算法交换密钥。我有一个用于消息交换的异步回调和一个用于密钥交换的异步回调。我想知道在需要时如何调用密钥交换一号,因为它总是调用消息交换一号。 这是我在本地连接其他程序的代码: private void btnStart_Click(object sender, EventArgs e) { try {

我正在制作两个可以相互通信的Windows窗体应用程序。我让他们互相交流,并在他们之间进行数据加密和解密。但现在我需要让他们用Deffie-Hellman算法交换密钥。我有一个用于消息交换的异步回调和一个用于密钥交换的异步回调。我想知道在需要时如何调用密钥交换一号,因为它总是调用消息交换一号。 这是我在本地连接其他程序的代码:

private void btnStart_Click(object sender, EventArgs e)
    {
        try
        {
            epLocal = new IPEndPoint(IPAddress.Parse(txtIPc1.Text), Convert.ToInt32(txtPortc1.Text));
            sck.Bind(epLocal);

            epRemote = new IPEndPoint(IPAddress.Parse(txtIPc2.Text), Convert.ToInt32(txtPortc2.Text));
            sck.Connect(epRemote);

            byte[] buffer = new byte[1500];
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);

            btnStart.Text = "Connected";
            btnStart.Enabled = false;
            btnKey.Enabled = true;
            textMessage.Focus();
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.ToString());
        }
    }
我有两个异步回调方法

私有void MessageCallBack(IAsyncResult aResult)

私有void键回调(IAsyncResult aResult)

这就是我发送数据的方式,但它总是将数据发送到MessageCallBack。我如何指定何时发送到MessageCallBack以及何时发送到KeyCallBack

         try
         {

            if (Convert.ToInt32(txtDeffiKey.Text) > 15 || Convert.ToInt32(txtDeffiKey.Text) <= 0)
            {
                MessageBox.Show("Number should be between 1-15");
                return;
            }
            else
            {
                ASCIIEncoding enc = new ASCIIEncoding();

                MyDefaultKey = deffie_Hellman.DefaultMod(Convert.ToDouble(txtDeffiKey.Text)).ToString();

                var msg = enc.GetBytes(MyDefaultKey);

                sck.Send(msg);

                btnKey.Enabled = false;
                btnSend.Enabled = true;
            }
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
        }
试试看
{

if(Convert.ToInt32(txtDeffiKey.Text)>15 | | Convert.ToInt32(txtDeffiKey.Text)这个代码天生就坏了,因为<代码>接收< /代码>可以接收任何数量的字节,并且您似乎没有任何类型的分隔符。它不能保证返回您发送的内容;TCP/IP是基于流的,不是基于消息的。请考虑类似于基于行的协议,并使用<代码> StreamReader <代码>缠绕<代码> n。etworkStream
,甚至WCF或gRPC;这比原始套接字操作更易于编程处理。使用
异步
/
等待
这些方法,而不是
开始…
/
结束…
将消除回调的复杂性。