【问题标题】:problem by connecting a device [modem] over TCP通过 TCP 连接设备 [调制解调器] 的问题
【发布时间】:2009-09-03 22:28:23
【问题描述】:

我想通过 TCP 协议连接设备 [一种调制解调器]。

设备可以被视为客户端。通过一个我想要的程序 连接到此设备。该程序位于服务器上,并且 有一个特殊的端口开放和一个静态IP。

我该怎么做?

这是我的代码:

    // where ip= 10.0.0.50 and port= 5050, established for the server!
    TcpListerner listener;
    if listener!= null)
        {
            listener.Stop();
        }
        listener= new TcpListener(ip, port);
        listener.Start();


         Socket socket;
         if (!listener.Pending())
         {
             IAsyncResult ar = listener.BeginAcceptSocket(new AsyncCallback(DoAcceptSocketCallback), socket);
             Thread.Sleep(15000);  // try to connect in 15 seconds

             if (socket != null && socket.Connected)
             {
                // if socket is connected
                // put the code here or do nothing
             }
             else
             {
                    if (socket != null)
                    {
                        socket.Close();
                    }
                    if listener!= null)
                    {
                        listener.Stop();
                        listener = null;
                    }

              }
         }

    public void DoAcceptSocketCallback(IAsyncResult ar)
    {
        try
        {
            TcpListener listener = (TcpListener)ar.AsyncState;

            if (listener != null)
            {
                // connected to socket :
                socket = listener.EndAcceptSocket(ar);
            }
        }
        catch
        {
            socket = null;
        }
    }

虽然我无法连接设备,也无法通过套接字连接解决挂起问题。当此代码运行 15 秒以尝试连接时,我无法在表单上执行任何操作。

【问题讨论】:

    标签: c# tcp sockets


    【解决方案1】:

    我认为您应该对代码进行一些更改。

    当客户端连接时,使用该语句创建一个 TcpClient 对象

    TcpClient client = listener.AcceptTcpClient()
    

    然后您可以创建一个线程来处理客户端,这样主线程就不会卡住。

    if (!listener.Pending())
    {
        TcpClient client = listener.AcceptTcpClient();
        Thread newThread = new Thread(this.ServeClient);
        newThread.Start(client);
    }
    

    然后是处理线程的方法

    public static void ServerClient(TcpClient client)
    {
        // Do some work
    }
    

    如果您使用线程池而不是在每个连接处创建一个新线程会更好。使用此方法,您可以控制服务器可以处理的最大连接数。我对这个功能了解不多,因为我没有在大型程序中使用过。

    我建议你检查the Code Project example on Thread Pool

    【讨论】:

    • 我已经用有关线程池的信息更新了答案。检查一下,如果您发现新添加的信息有用,请标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2014-07-25
    • 2012-11-04
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多