C# - połączenie TCP - wykrywanie rozłączenia klienta

0

wszystko jest dobrze do momentu wykrywania który klient się rozłączył

podłączenie klienta wygląda tak:

private void StartListen()
        {
            tcpServer = new TcpListener(serverParams.ipAddress, serverParams.iPort);
            


            tcpServer.Start();
            bServerStarted = true;
           


            while (true)
            {
                try
                {
                    Thread t = new Thread(new ParameterizedThreadStart(NewClient));
                    tcpClient = tcpServer.AcceptTcpClient();
                    IPEndPoint sender = new IPEndPoint(((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address,
                 ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Port);
                   
 EndPoint endPtn = (EndPoint)sender;


                    tcpClient.Client.BeginReceiveFrom(state.buffer,
                                                      0,
                                                      StateObject.BufferSize,
                                                      0,
                                                      ref endPtn,
                                                      new AsyncCallback(this.OnReceive),
                                                      state);
            
                    t.Start(tcpClient);
                }
                catch (Exception)
                {

                }

            
            }
        }

jak widać na reakcję klienta odpowiada funkcja OnReceive

no i odpowiada, działa jak powinna ale nie wiem który klient zgłasza zakończenie pracy

ja wiem, że na razie EndPoint jest nic nie wart, ale nie wiem co zrobić, ze był coś wart?

jak można to ulepszyć, żeby było wiadomo, który klient się rozłączył

0

Hmmm , a na pewno zrozumiałeś dobrze co to jest EndPoint?:>:)

0
endpoint napisał(a)

Hmmm , a na pewno zrozumiałeś dobrze co to jest EndPoint?:>:)

może nie - ale jak mam możliwość n- połączeń do serwera to nawet gdybym jako argument funkcji dawał i-ty element tablicy endpointów to jak przy rozłączaniu się klienta wykryć który to klient skoro jedynym argumentem funkcji obsługującej zwrot jest IAsyncResult ar

jak w funkcji public void OnReceive(IAsyncResult ar) wykryć który klient się wyłącza

być może walę bzdury
albo coś - ale gdybym wiedział to bym nie pytał

0

Jeżeli wyślesz coś do socketa ktory jest rozłączony to wyrzuci Ci SocketException.
Możesz wysyłać jakieś małe pingi co ileś sekund.

teoretycznie socket ma właściwość connected ale ona zmieni się na false dopiero gdy wcześniej zrobimy coś w stylu właśnie wysłania wiadomości.

0
dark_astray napisał(a)

Jeżeli wyślesz coś do socketa ktory jest rozłączony to wyrzuci Ci SocketException.
Możesz wysyłać jakieś małe pingi co ileś sekund.

teoretycznie socket ma właściwość connected ale ona zmieni się na false dopiero gdy wcześniej zrobimy coś w stylu właśnie wysłania wiadomości.

Nie wiem może to ja źle rozumiem
ale mi chodzi o to, żeby serwer "wiedział" który klient się od niego odłączył
a nie klient, że serwer sie wyłączył

0

ale przecież po obydwu stronach masz sockety.

0
dark_astray napisał(a)

ale przecież po obydwu stronach masz sockety.

ja tego nie ogarniam - mógłby ktoś WIELKIMI LITERAMI bo się motam i nic z tego nie ma

serwer dla każdego klienta ustanawia takie coś

tcpClient.Client.BeginReceiveFrom(state.buffer,
0,
StateObject.BufferSize,
0,
ref endPtn,
new AsyncCallback(this.OnReceive),
state);

czyli funkcja OnReceive - jest funkcją, która reaguje na wiadomośc klienta
i rzeczywiście tak jest - daje breakpointa - zatrzymuje się - wszystko jest OK

ale nie wiem po stronie serwera który klient "uruchomił" tą funkcję

i o to mi cały czas chodzi

jak to sprawdzić - mam tablicę klientów, które się połączyły
ale sprawdzam
i atrybuty
.Activate
.Client.Connected
są TRUE
(niby logiczne, że tak jest, skoro nic z nimi nie robiłem)

jak sprawdzić który klient "uruchomił" OnReceive?

być może to ja xle do tego podchodzę może to całkiem inaczej trzeba, dla każdego klienta np inna funkcja

alle nie mam pomysłu jak to zrobić

dlatego prosiłbym o coś więcej na ten temat - z góry dziękuję

0

tcpClient . ->CLIENT <---- to jest SOCKET

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.beginreceivefrom.aspx

tcp jest polaczeniowe, point-to-point, i mozesz na to patrzec tak:
[klient]socket)))>------siec-----------<((socket[sewer]socket))>---------siec--------<((socket[klient]

na kazdej stronie, jeden tcp-socket, na jedno polaczenie.
jezeli serwer ma 30 klientow, to ma dla kazdego jeden otwarty socket po tcp/ip.
ów .Client jest .Netowa nakladka na socket. Uzywajac .Client gadasz z jednym konkretnym klientem. kpw?

co wiecej, ow "ref EndPoint remoteEP" to sa wlasnie dane idnetyfikacyjne..
i co jeszcze wiecej, owo 'Object state' ktore podajesz, jest pozniej przekazywane Twojej metodzie..
patrz tu:
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.beginreceivefrom.aspx "To do this, at the very minimum(...)"
http://msdn.microsoft.com/en-us/library/system.asynccallback.aspx

btw. najprociej Twoj callback dowie sie wsyzstkiego, jezeli ten callback bedize po prostu niestatyczna metoda StateObject'a..

1 użytkowników online, w tym zalogowanych: 0, gości: 1