C# Windows CE设备上.NET CF 2.0上的TCP侦听器出现问题 设备:摩托罗拉WT41N0 Windows CE 7.0 设备:摩托罗拉WT4090 Windows CE 5.0 设备网络:所有设备都连接到我们的Cisco无线系统 .NET Framework:.NET 2.0 CF

C# Windows CE设备上.NET CF 2.0上的TCP侦听器出现问题 设备:摩托罗拉WT41N0 Windows CE 7.0 设备:摩托罗拉WT4090 Windows CE 5.0 设备网络:所有设备都连接到我们的Cisco无线系统 .NET Framework:.NET 2.0 CF,c#,windows,windows-ce,tcpclient,C#,Windows,Windows Ce,Tcpclient,背景 我正在尝试在移动设备上创建一个TCP侦听器,以响应来自服务器应用程序的TCP消息请求。出于测试目的,我让应用程序响应一条以“reply”开头的消息,并简单地发送一条带有当前时间的消息,然后关闭 问题 少数设备将停止响应消息请求,使我认为我尝试在设备上接收TCP消息的方法有问题。我已经运行了一些测试,在这些测试中,我让服务器应用程序在设备漫游不同的无线接入点时发送TCP消息,并且在我的测试期间,它将始终恢复到完美状态。我认为在我如何让设备接收消息方面存在问题 Windows CE设备代码(服

背景

我正在尝试在移动设备上创建一个TCP侦听器,以响应来自服务器应用程序的TCP消息请求。出于测试目的,我让应用程序响应一条以“reply”开头的消息,并简单地发送一条带有当前时间的消息,然后关闭

问题

少数设备将停止响应消息请求,使我认为我尝试在设备上接收TCP消息的方法有问题。我已经运行了一些测试,在这些测试中,我让服务器应用程序在设备漫游不同的无线接入点时发送TCP消息,并且在我的测试期间,它将始终恢复到完美状态。我认为在我如何让设备接收消息方面存在问题

Windows CE设备代码(服务器) 服务器代码(客户端)

进一步解释 我知道,在某个时刻,它将停止侦听该端口,并抛出一个错误站,该错误站是机器主动拒绝连接的

现在的“服务器”代码只是由接收方(9000)调用。它还将创建位于while循环上的后台线程,该线程将在“TcpClient client=listener.AcceptTcpClient();”处等待

当我使用“客户端”代码发送TCP消息时,服务器代码将运行并等待另一次连接尝试

我在两台台式电脑的模拟中使用了这段代码,其中设置了以下内容

PC1(服务器)-它只是等待,直到它收到消息并快速响应,关闭连接,然后等待另一个连接

PC2(客户端)-重复发送消息,接收响应消息并关闭连接


考虑到那个测试,我让它运行了一个多星期,没有任何问题。我甚至还运行了相同的测试,设备没有问题地连接到电源上。因此,我的想法是,由于设备处于无线环境中,它需要能够从断开的连接中恢复。因此,我想我的问题是,如果设备失去无线并重新获得它,“服务器”是否能够正确恢复。我唯一能想到的另一件事是以某种方式监视线程,并在它失败时重新创建一个新的侦听器线程。

记录您的异常,这样您就可以看到哪里出了问题。如果不这样做,就会可靠地再现问题,如果没有对代码执行情况的精确解释,那么几乎不可能说出问题的实际原因。禁用Nagle(即,
NoDelay=true
)通常是一个坏主意(尤其是在移动网络上),但可能与您所看到的内容有关,也可能与您所看到的内容无关(无论实际是什么……我很难调和“将停止响应”和“将始终恢复无缺陷”这两种说法,它们似乎直接相互矛盾).好的,我只是对我的问题做了更多的解释。
public void Receiver(int port)
{
    Thread ct = new Thread(
     new ThreadStart(
        delegate()
        {
            // Create the listener and start it
            TcpListener listener = new TcpListener(port);
            listener.Start();

            // Main listen loop
            while (true)
            {
                // Try to connect client
                try
                {
                    TcpClient client = listener.AcceptTcpClient();

                    client.NoDelay = true;

                    // Get the client stream
                    StreamReader sr = new StreamReader(client.GetStream());
                    StreamWriter sw = new StreamWriter(client.GetStream());

                    // Decode the TCP message
                    try
                    {
                        string request = sr.ReadLine();

                        if (request.StartsWith("reply"))
                        {
                            sw.WriteLine("reply|");
                            sw.WriteLine("time" + DateTime.Now.ToString());

                            sw.Flush();
                            sw.Close();
                            sr.Close();
                        }

                    }
                    catch (Exception exc)
                    {
                        if (client.Client.Connected == true)
                        {
                            client.Close();
                            listener.Stop();
                            listener.Start();
                        }
                    }

                    client.Close();

                }
                catch (Exception)
                {

                }
            }
        }));

    ct.IsBackground = true;
    ct.Start();
}

public void SendMessage(string ip_address, string port, string message)
{
    // Variables
    string request = "";

    try
    {
        TcpClient Client = new TcpClient();

        Client = new TcpClient(ip_address, Convert.ToInt32(port));

        Client.NoDelay = true;
        Client.ReceiveTimeout = 1000;
        Client.SendTimeout = 1000;
        StreamWriter Writer = new StreamWriter(Client.GetStream());
        StreamReader sr = new StreamReader(Client.GetStream());

        Writer.WriteLine(message);
        Writer.Flush();

        request = sr.ReadToEnd();
        new_message = request;

        //Close Connection
        Client.Close();
        Writer.Close();
        sr.Close();
    }
    catch (Exception exc)
    {

    }
}