C# 从一个套接字向两个回调发送数据
我正在制作两个可以相互通信的Windows窗体应用程序。我让他们互相交流,并在他们之间进行数据加密和解密。但现在我需要让他们用Deffie-Hellman算法交换密钥。我有一个用于消息交换的异步回调和一个用于密钥交换的异步回调。我想知道在需要时如何调用密钥交换一号,因为它总是调用消息交换一号。 这是我在本地连接其他程序的代码:C# 从一个套接字向两个回调发送数据,c#,sockets,C#,Sockets,我正在制作两个可以相互通信的Windows窗体应用程序。我让他们互相交流,并在他们之间进行数据加密和解密。但现在我需要让他们用Deffie-Hellman算法交换密钥。我有一个用于消息交换的异步回调和一个用于密钥交换的异步回调。我想知道在需要时如何调用密钥交换一号,因为它总是调用消息交换一号。 这是我在本地连接其他程序的代码: private void btnStart_Click(object sender, EventArgs e) { try {
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;这比原始套接字操作更易于编程处理。使用异步
/等待
这些方法,而不是开始…
/结束…
将消除回调的复杂性。