如何进行点对点确认通信C#

时间:2014-04-13 11:46:19

标签: c# p2p tcpclient tcplistener

在我的公司,我们有一个自动工作站,通过LAN运行Iperf和其他软件, 现在我得到了改善沟通的任务。我是C#的新手,需要一些帮助。 我们现在拥有的是: 其他消息的简单监听器

public void Connect(int port, string Host)
    {
        if (!Connected)
        {
            Connected = true;
            SetIP(port, Host);
            t1 = new Thread(new ThreadStart(CreateListener));
            t1.Name = "Listener Thread";
            t1.Priority = ThreadPriority.AboveNormal;
            t1.Start();
        }

public void Disconnect()
{
    if (Connected)
    {
        t1.Abort();
        peerListener.Stop();
        Connected = false;
    }

}

    private void CreateListener()
    {
        try
        {
            int iLength = 0;
            Socket tc = null;
            peerListener = new TcpListener(IPAddress.Any, port);
            peerListener.Start();
            while (true)
            {
                if (!peerListener.Pending())
                {
                  //Read data
                }
            }
         }catch { }
     }

和信使:

    private void CreateClient(object message)
    {
        try
        {
            peerClient = new TcpClient();
            peerClient.Connect(host, port);


            netStream = peerClient.GetStream();
            StreamWriter sw = new StreamWriter(netStream);
            sw.Write((string)message);
            //sw.Write((string)messa
            sw.Flush();

            netStream.Close();
            peerClient.Close();
        }
        catch
        {
        }
    }

    internal void Write(string message)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(CreateClient), message);
    }

我们的工作是发送简单短信,并通过_TextChanged事件解析文本屏幕和DO SOMETHING

到目前为止,我正在搜索的是确认一旦发送消息,我可以确认另一方的应用程序收到消息的方法。

这一切都与TcpListener一起使用所以我很确定有一种方法可以对它进行采样并获得标记或其他能给我想要的东西

提前谢谢

1 个答案:

答案 0 :(得分:1)

使用TCP发送数据时,首先无法保证交付。如果有人拉电缆,交付可能会延迟或根本不会发生。这是一项重大的性能优化。

您可以通过两种方式获得有保障的交付:

  1. 呼叫关机(发送)。这会发送所有内容并等待确认。出于这个原因,您应该在关闭之前始终关闭套接字。
  2. 让远程方通过确认回复您。您必须修改协议以支持此功能。
  3. 实现(1)足以使接收器在收到消息后发送单个零字节。发件人必须读取此字节。只有当它被读取时才知道收到了消息。

    我发现代码中有很多错误。这对我来说非常令人担忧。如果发生错误,您将永远不会发现。也许代码片段只是删节了。

    Also, do not abort threads.