проблема при подключении устройства [модема] через 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
}

Было бы лучше, если бы вы использовали пул потоков вместо создания одного нового потока при каждом соединении. Используя этот метод, вы можете контролировать максимальное количество подключений, которые может обработать ваш сервер. Я мало что знаю об этой функциональности, так как не использовал ее в больших программах.

Я бы посоветовал вам проверить пример проекта кода в пуле потоков

person Manish Sinha    schedule 02.09.2009
comment
Я обновил ответ информацией о пуле потоков. Проверьте это и, пожалуйста, отметьте это как ответ, если вы найдете новую добавленную информацию полезной. - person Manish Sinha; 03.09.2009