Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Служба останавливается при вызове Accept(), службы и сокеты tcp 
:(
    Опции темы
Zerofill
Дата 14.1.2014, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.9.2009

Репутация: нет
Всего: нет



Здравствуйте!

Есть windows служба. Ранее при старте она запускала поток, который общался посредством сокетов (был клиентом) с внешним приложением в сети. При этом все работало хорошо. Теперь нужно, чтобы служба общалась посредством сокетов (только уже как сервер) с консольными приложением (клиентом) на этом же компьютере, что и сама служба. Но как только клиент пытается отправить данные службе, служба останавливается (при этом в журнале никаких сообщений об ошибках нет), а клиент выдает исключение, что соединение было разорвано. Помогите, пожалуйста, разобраться.

Сервер (служба)
Код

byte[] bytes = new Byte[2048];
            List<byte> d;
            Socket listener = null, handler = null;

            Functions.WriteTrace("UIClientServer started");
            do
            {
                // Establish the local endpoint for the socket.
                IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);

                // Create a TCP/IP socket.
                listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // Bind the socket to the local endpoint and 
                // listen for incoming connections.
                try
                {
                    listener.Bind(localEndPoint);
                    listener.Listen(10);
                    Functions.WriteTrace("Waiting for a connection...");
                    

                    // Start listening for connections.
                    while (true)
                    {
                         data = null;
                        // Program is suspended while waiting for an incoming connection.
                        handler = listener.Accept(); //после этой строчки служба останавливается
                        

                        if (handler.Connected && handler.Poll(-1, SelectMode.SelectRead))
                        {
                            ...прием данных
                        }                        

                        if (handler.Connected && bytes.Length > 0 && bytes[0] == 0xAE)
                        {
                                                            ...обработка полученных данных
                                d = new List<byte>(0xAE);
                                d.AddRange(Serialize(signal));

                                if (handler.Connected && handler.Poll(-1, SelectMode.SelectWrite))
                                {
                                    handler.Send(d.ToArray());
                                }
                        }

                        handler.Shutdown(SocketShutdown.Both);
                        handler.Close();
                        
                            Thread.Sleep(2000);
                        
                    }//while

                }
                catch (Exception ex)
                {
                    Functions.WriteTrace(((SocketException)ex).ErrorCode.ToString(), TraceEventType.Error);
                    Functions.WriteTrace(ex.ToString(), TraceEventType.Error);

                        handler.Shutdown(SocketShutdown.Both);
                        handler.Close();
                        
                        Functions.WriteTrace("timeout 2 min", TraceEventType.Warning);
                        Thread.Sleep(120000);
                    
                }
            } while (DriversService.iAmAlive);


Консольное приложение (клиент)
Код

byte[] bytes = new byte[2048];        // Data buffer for incoming data.
                List<byte> d;
                Socket sender = null;


                bool commandSent = false;
                // Connect to a remote device.
                do
                {
                    try
                    {
                        // Establish the remote endpoint for the socket.
                        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);

                        // Create a TCP/IP  socket.
                        sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                        // Connect the socket to the remote endpoint. Catch any errors.
                        
                            sender.Connect(remoteEP);

                            while (true)
                            {
                                if (sender.Connected && controller.CommandReady && !commandSent)
                                {
                                    ...готовим данные для отправка

                                    if (sender.Poll(-1, SelectMode.SelectWrite))
                                    {
                                        // Send the data through the socket.
                                        int bytesSent = sender.Send(data.ToArray()); //здесь вываливается исключение
                                        commandSent = true;
                                    }

                                }

                                if (sender.Connected && commandSent && sender.Poll(-1, SelectMode.SelectRead))
                                {
                                    // Receive the response from the remote device.
                                    int bytesRec = sender.Receive(bytes);


                                    if (bytes[0] == 0xAE)
                                    {
                                        ...обработка полученных данных
                                    }

                                }
                                    Thread.Sleep(2000);
                                
                            }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString() + '\n' + ((SocketException)ex).ErrorCode.ToString());

                            Console.WriteLine(" timeout 2 minutes");
                            Thread.Sleep(120000);
                        
                    }
                } while (iAmAlive);



Это сообщение отредактировал(а) Zerofill - 14.1.2014, 12:42
PM MAIL   Вверх
jonie
Дата 14.1.2014, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



код запускается всё также в отдельном потоке?
Подключитесь отладчиком (Attach to process) - посмотрите в output - какие там Exception-ы есть?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Zerofill
Дата 14.1.2014, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.9.2009

Репутация: нет
Всего: нет



Да, код запускается в отдельном потоке. 
Хм... после замены listener.Connected на handler.Connected служба перестала закрываться. И даже доходит до получения данных.. Сейчас проблема, судя по всему, в сериализации... Потому как клиент данные передает, а сервер говорит, что в буфере пусто и ничего нет. jonie, спасибо, что откликнулись и попытались помочь! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.