проблема при подключении устройства [модема] через TCP - PullRequest
0 голосов
/ 27 августа 2009

Я хочу подключить устройство [своего рода модем] по 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 секунд попытка подключения.

1 Ответ

1 голос
/ 02 сентября 2009

Я думаю, вы должны внести некоторые изменения в свой код.

Когда клиент подключается, создайте объект 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
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...