重新连接到未关闭的套接字连接C#

时间:2017-03-01 09:55:20

标签: c# sockets

我有一个Listener应用程序,需要显示一个字符串消息。我无法修改此应用程序。 我必须通过我的C#客户端向此监听器发送消息。监听器和客户端都应该在同一台PC(本地主机)上运行。

我的连接代码:

    public void ConnectAndSendMessage(string MessageToSend)
    {
        string localIP = GetIPAddress();

        try
        {
            TcpClient tcpclnt = new TcpClient();
            Console.WriteLine("Connecting.....");
            tcpclnt.Connect(localIP, 2400);

            Socket socket = tcpclnt.Client;
            bool connectionStatus = socket.Connected;

            if (connectionStatus)
            {
                //Send Message
                ASCIIEncoding asen = new ASCIIEncoding();
                //string sDateTime = DateTime.Now.ToString();
                int SendStatus = socket.Send(asen.GetBytes(MessageToSend + Environment.NewLine));
            }
            Thread.Sleep(2000);

            tcpclnt.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine("Error..... " + e.StackTrace);
        }
    }

问题:

客户端应用程序运行正常并将消息成功发送到监听器。 但问题是,如果客户端在执行tcpclnt.Close();之前崩溃(我关闭客户端程序)。 在这种情况下,如果我再次重新启动客户端程序然后,我无法连接到套接字,因为应用程序没有关闭上一次运行中的套接字(崩溃运行)。

如何在这种情况下重新连接到监听器?

1 个答案:

答案 0 :(得分:0)

尝试这个..

public void ConnectAndSendMessage(string MessageToSend)
{
    string localIP = GetIPAddress();

    using (System.Net.Sockets.TcpClient tcpclnt = new System.Net.Sockets.TcpClient())
    {
        try
        {
            Console.WriteLine("Connecting.....");
            tcpclnt.Connect(localIP, 2400);

            using (System.Net.Sockets.Socket socket = tcpclnt.Client)
            {
                if (socket.Connected)
                {
                    //Send Message
                    System.Text.ASCIIEncoding asen = new System.Text.ASCIIEncoding();
                    //string sDateTime = DateTime.Now.ToString();
                    int SendStatus = socket.Send(asen.GetBytes(MessageToSend + Environment.NewLine));
                }
                System.Threading.Thread.Sleep(2000);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error..... " + e.StackTrace);
        }
        finally
        {
            if (tcpclnt != null && tcpclnt.Connected)
                tcpclnt.Close();
        }
    }
}