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

Заранее спасибо.
//коллекция клиентов
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;
}
}
}
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1