проблем при свързване на устройство [модем] през TCP

Искам да свържа устройство [вид модем] през 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 секунди за опит за свързване.


person Cmptrb    schedule 27.08.2009    source източник


Отговори (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
}

Би било по-добре, ако използвате Thread Pool, вместо да създавате една нова нишка при всяка връзка. Използвайки този метод, можете да контролирате максималния брой връзки, които вашият сървър може да обработи. Не знам много за тази функционалност, тъй като не съм я използвал в големи програми.

Бих ви предложил да проверите примера за Code Project в Thread Pool

person Manish Sinha    schedule 02.09.2009
comment
Актуализирах отговора с информация за Thread Pool. Вижте го и, моля, маркирайте го като отговор, ако намирате новата добавена информация за полезна. - person Manish Sinha; 03.09.2009