Как узнать закрылся ли Connection на удаленом компьютере?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Как узнать закрылся ли Connection на удаленом компьютере?

Сообщение Kulip@tor » 07.12.2004 (Вт) 9:57

Кто знает? Подскажите мне надо узнать во время асинхронной приема/передачи если удаленый компьютер потерял связь с нетом как это обнаружить? Пробовал через
bytesreceived=socket.endreceive(ar)
' Если bytesreceived=0 тогда связь оборвалась
Только это реагирует на то если подключение закрыть на местном компьюторе. Как быть????? :(

Заранее спасибо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.04.2005 (Вс) 2:04

Ап. Мне теперь тоже надо :-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.04.2005 (Вс) 4:13

А разве сокет не должон сам закрываться? А проперть Connected чего возвращает?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.04.2005 (Вс) 4:43

Должон. Connected ошибочно возвращает true.
Изображение

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 24.04.2005 (Вс) 8:19

Свойство Connected не делает мониторинг сокета.Оно меняется только после операции I/O. Надо либо делать отдельный поток который проверяет наличие связи.Либо не знаю как.У кого что-то выйдет сообщите.Пасиб.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2005 (Пн) 9:33

Короче, я всё сделал через WSAEventSelect и иже с ними. Хоть всё и работает, но осталось ощущение грязно выполненной работы. Зачем же у дотнета такое ассоциирующееся с сетью название, если он даже функциональность Winsock2 в себя не включает? :-(
Изображение

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 25.04.2005 (Пн) 12:24

tyomitch mojew prislat primer???? Spasibo zaranee.
milo: achi-@mail.ru

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.04.2005 (Вт) 23:21

Он у меня на C#, это ничего? :-)

(кусок выдран из большой проги, поэтому в чистом виде, ессно, не запустится)
Код: Выделить всё
   //коллекция клиентов
   class Clients:CollectionBase
   {
      [DllImport("ws2_32.dll")] private static extern int WSACreateEvent();
      [DllImport("ws2_32.dll")] private static extern bool WSACloseEvent(int hEvent);
      [DllImport("ws2_32.dll")] private static extern bool WSAResetEvent(int hEvent);
      private enum FD_BIT
      {
         READ      =0,
         WRITE     =1,
         OOB       =2,
         ACCEPT    =3,
         CONNECT   =4,
         CLOSE     =5,
         QOS       =6,
         GROUP_QOS =7,
         ROUTING_INTERFACE_CHANGE =8,
         ADDRESS_LIST_CHANGE =9
      }
      private const int FD_MAX_EVENTS = 10;
      [Flags]   private enum FD
      {
         READ          =(1 << FD_BIT.READ),
         WRITE         =(1 << FD_BIT.WRITE),
         OOB           =(1 << FD_BIT.OOB),
         ACCEPT        =(1 << FD_BIT.ACCEPT),
         CONNECT       =(1 << FD_BIT.CONNECT),
         CLOSE         =(1 << FD_BIT.CLOSE),
         QOS           =(1 << FD_BIT.QOS),
         GROUP_QOS     =(1 << FD_BIT.GROUP_QOS),
         ROUTING_INTERFACE_CHANGE =(1 << FD_BIT.ROUTING_INTERFACE_CHANGE),
         ADDRESS_LIST_CHANGE =(1 << FD_BIT.ADDRESS_LIST_CHANGE),
         ALL_EVENTS    =(1 << FD_MAX_EVENTS) - 1
      }
      [DllImport("ws2_32.dll")] private static extern int WSAEventSelect(IntPtr socket, int hEvent, FD lNetworkEvents);
      [DllImport("ws2_32.dll")] private static extern int WSAWaitForMultipleEvents(int cEvents, int[] lphEvents, bool fWaitAll, int dwTimeout, bool fAlertable);
      [StructLayout(LayoutKind.Sequential)] private struct WSANETWORKEVENTS
      {
         public FD lNetworkEvents;
         [MarshalAs(UnmanagedType.ByValArray, SizeConst=FD_MAX_EVENTS)]
         public int[] iErrorCodes;
      };
      [DllImport("ws2_32.dll")] private static extern int WSAEnumNetworkEvents(IntPtr socket, int hEvent, ref WSANETWORKEVENTS lpNetworkEvents);

      private ArrayList events;
      private IntPtr ListenerHandle;

      public Clients(MyListener listener)
      {
         events=new ArrayList();
         ListenerHandle=listener.Handle;
         int _event=WSACreateEvent ();
         WSAEventSelect(ListenerHandle, _event, FD.ACCEPT);
         events.Add (_event);
      }

      ~Clients()
      {
         for (int i=Count; i>0; i--) {RemoveAt(i);}
         WSACloseEvent ((int)events[0]);
      }

      public void Add(Cli client)
      {
         List.Add(client);
         client.index.data = List.Count;
         int _event=WSACreateEvent ();
         WSAEventSelect(client.socket.Handle, _event, FD.READ |FD.WRITE |FD.CLOSE );
         events.Add (_event);
      }
      public void Remove(Cli client)
      {
         RemoveAt (List.IndexOf (client));
      }
      public new void RemoveAt(int index)
      {
         List.RemoveAt(index-1);
         WSACloseEvent ((int)events[index]);
         events.RemoveAt (index);
      }
      public Cli this [int Index]
      {
         get
         {
            return (Cli) List[Index-1];
         }
         set
         {
            List[Index-1]=value;
         }
      }
      
      public void WaitAny()
      {
         int result=WSAWaitForMultipleEvents(events.Count, (int[])events.ToArray (new int().GetType()), false, -1, false);
         if (result<events.Count)
         {
            IntPtr _socket=(result>0?this[result].socket.Handle:ListenerHandle);
            int _event=(int)events[result];
            WSANETWORKEVENTS _events = new WSANETWORKEVENTS(); _events.lNetworkEvents =FD.ALL_EVENTS;
            WSAEnumNetworkEvents (_socket, _event, ref _events);
            if (result>0 && (_events.lNetworkEvents & FD.CLOSE)!=0)
            {
               this[result].closed.data =true;
            }
         }
      }
   }



vbskb_net vbskb_socket vbskb_event vbskb_dotnet vbskb_network
Изображение

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 27.04.2005 (Ср) 12:04

ok pasib

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 27.04.2005 (Ср) 16:03

Только что проверил...
проперти Connected прекрасно работает.


If Not mySocket.Connected Then
'connect
end if

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.04.2005 (Ср) 16:33

Через инет тоже?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 27.04.2005 (Ср) 16:39

Через инет не проверял, а на network работает

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.04.2005 (Ср) 16:52

Внимательно прочитай самый первый пост :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 27.04.2005 (Ср) 16:55

Sorry.....
не заметил :oops:


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 63

    TopList