【问题标题】:how to make peer to peer confirmed communication C#如何使点对点确认通信C#
【发布时间】:2014-04-13 11:46:19
【问题描述】:

在我的公司,我们有一个自动站,可以跨 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,所以我很确定有一种方法可以对其进行采样并获得标志或其他东西,这会给我想要的东西

先谢谢了

【问题讨论】:

  • 没有办法检查消息是否真的发送,消息只是排队到sendbuffer。因此,在发送后关闭套接字,将处理缓冲区以及可能未发送的消息。您可以在关闭前尝试延迟。这是我不喜欢套接字的地方......或者你应该返回一条消息,该消息已收到。
  • @JeroenvanLangen 这是我现在正在实现的(在每条消息(连接、运行、停止等)之后发送和反馈消息)我可以做什么而不是使用套接字,以及什么是优势?
  • 目前,我不知道确认消息的更好选择。

标签: c# p2p tcpclient tcplistener


【解决方案1】:

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

您可以通过两种方式实现保证交付:

  1. 呼叫关闭(发送)。这会发送所有内容并等待确认。出于这个原因,您应该始终在关闭套接字之前关闭套接字。
  2. 让对方回复您并确认。您必须修改协议以支持此功能。

要实现 (1),让接收者在收到消息后发送一个零字节就足够了。发送者必须读取这个字节。只有读过才知道收到了消息。

我看到你的代码中有很多错误。这让我非常担心。如果发生错误,您将永远不会发现。也许代码 sn-p 只是被删减了。

Also, do not abort threads.

【讨论】:

  • 感谢您的回答! .您能否举例说明您认为我需要执行的步骤(关于您提到的建议)?我也会尝试纠正线程关闭的方式'但如果您在这里有任何好的解决方案,我会以我公司的名义感谢您:)
  • 您似乎必须在每个连接中交换多条消息。所以不能关机。我编辑了帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2019-09-15
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2021-05-08
相关资源
最近更新 更多