Comment faire pour déterminer si le protocole tcp est connecté ou pas?

J'ai tcpclient objet et je voulez savoir si il est connecté ou pas.
j'ai connecté la propriété de tcpclient mais elle renvoie l'état de la dernière opération. donc ce n'est pas utile.

puis-je utiliser ce code :

bool flag;
flag = (tcp.Client.Poll(10000, SelectMode.SelectWrite));

et

 if( tcp.Client.Poll( 0, SelectMode.SelectRead ) )
 {
   byte[] buff = new byte[1];
   if( tcp.Client.Receive( buff, SocketFlags.Peek ) == 0 )
   {
     flag = false;
   }
 }

mais il ne fonctionne pas correctement.

Une idée?


c'est mon code côté serveur :

   private ArrayList _ClientList = new ArrayList();
public ClsServer(int port)
{
_TCPListener = new TcpListener(IPAddress.Any, port);
_TCPListener.Start();
Thread ListenThread = new Thread(new ThreadStart(ListenForClients));
ListenThread.IsBackground = true;
ListenThread.Start();
}
private void ListenForClients()
{            
while (true)
{
//blocks until a client has connected to the server
TcpClient client = this._TCPListener.AcceptTcpClient();
client.ReceiveTimeout = 0;
//create a thread to handle communication with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
clientThread.IsBackground = true;
clientThread.Start(client);
}
}
private void HandleClientComm(object client)
{
try
{
TcpClient tcpClient = (TcpClient)client;               
AddObject(tcpclient);
int bytesRead;
string message = "";
byte[] RecievedPack = new byte[1024 * 1000];
NetworkStream clientStream = tcpClient.GetStream();
while (true)
{
bytesRead = 0;
try
{
////blocks until a client sends a message
bytesRead = clientStream.Read(RecievedPack, 0, RecievedPack.Length);
int Len = BitConverter.ToInt32(RecievedPack, 0);
message = UTF8Encoding.UTF8.GetString(RecievedPack, 0, Len);
}
catch (Exception er)
{
//When Client is disconnected
if (er.GetType() == typeof(IOException))
{
RemoveObject(client);
break;
}
}                   
//message has successfully been received                          
//do something
}
RemoveObject(client);
}
catch(Exception e)
{
//RemoveObject(client);
}
}
private void AddObject(object obj)
{            
int totalcount, index;
totalcount = _ClientList.Count;
index = 0;
while (index < totalcount)
{
TcpClient alcobj = (TcpClient)_ClientList[index];
try
{
if (IPAddress.Equals(((IPEndPoint)alcobj.Client.RemoteEndPoint).Address,
((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address))
{
_ClientList.Remove(alcobj);
break;
}
index++;
}
catch (Exception er)
{
if (er.GetType() == typeof(ObjectDisposedException))
RemoveObject(alcobj);
}
finally
{
totalcount = _ClientList.Count;
}
}            
_ClientList.Add(obj);             
}
private void RemoveObject(object obj)
{            
if (_ClientList.IndexOf(obj) > -1)
{
_ClientList.Remove(obj);
SendClientState(IP, false);
}         
}

et c'est le côté client :

    public bool IsConnected
{           
try
{
if (_TcpClient != null && _TcpClient.Client != null && _TcpClient.Client.Connected)
{
//Detect if client disconnected
if (_TcpClient.Client.Poll(0, SelectMode.SelectRead))
{
byte[] buff = new byte[1];
if (_TcpClient.Client.Receive(buff, SocketFlags.Peek) == 0)
{
//Client disconnected
return false;
}
else
{
return true;
}
}
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
private void clsClient()
{
if(!IsConnected()) 
{
Connecttoserver()
}
}
private void ConnectToServer()
{
try
{
NetworkStream _NetworkStream = _TcpClient.GetStream();
byte[] _RecievedPack = new byte[1024 * 1000];
string _Message = string.Empty;
int _BytesRead;
int _Length;
while (true)
{
_BytesRead = _NetworkStream.Read(_RecievedPack, 0, _RecievedPack.Length);
_Length = BitConverter.ToInt32(_RecievedPack, 0);
_Message = UTF8Encoding.UTF8.GetString(_RecievedPack, 4, _Length);
if (_BytesRead != 0)
{
if (OnReceive != null)
//do something
_NetworkStream.Flush();
}
}
}
catch (Exception exp)
{
//do something 
}
}

à côté client, IsConnected() retourne toujours faux et essayer de connecttoserver, de sorte que le serveur auditeur toujours essayer d'ajouter le client dans une liste

Êtes-vous d'allumer SocketOptionName.KeepAlive? Je pense que vous devez l'activer pour votre code. De toute façon, vous n'avez pas besoin de le faire. La solution générale est de considérer socket connecté, et si le socket opération échoue, gérer harmonieusement la perte de connexion. Mais si vous avez besoin de...
Veuillez lire le FAQ. Stackoverflow n'est pas un forum.
Comment est-ce un forum comme question? Dans tous les cas, la FAQ ne mentionne pas les forums.

OriginalL'auteur maryam mohammadi | 2011-08-09