logi sisse meist KKK

Murran pead ühe probleemi kallal, millele lahendust hästi ei leia.

Mu programm loob TCP/IP ühenduse teatud aadressiga, et kuulata sellelt saabuvaid teatud laadi andmeid. Aeg-ajalt katkestab serveripool ühenduse ära, siis tuleb sinna uuesti ühenduda.

Esimene probleem on selles, et kui server katkestab ühenduse, siis sokkel ei kaota oma "connected" omadust, kuigi andmeid enam ei saabu. Kui ma püüan porti kirjutada, siis tekib ühenduse katkestusviga otsekohe.

Teine probleem on selles, et kui püüan soklit uuesti ühendada, siis see enam selle programmi käivitamise ajal ei õnnestu.

Kasutan ühendamiseks sellist koodi (ei ole täielik):

 sokkel Sokkel;
    public class Sokkel{
        private Socket sokk;
        private AsyncCallback CallBack;
            public void ConnectAsync(IPAddress host,int port)
            {
                SocketAsyncEventArgs args = new SocketAsyncEventArgs();
                args.RemoteEndPoint = new IPEndPoint(addr, portnum);
                // kui ConnectAsync lõpetab, käivitab Completed-protseduuri
                args.Completed += new EventHandler<SocketAsyncEventArgs>(Completed);
                try
                {
                    //kui ConnectAsync() tagastab "false", siis täideti funktsioon sünkroonselt, 
                    // seetõttu käivitan collectData() kohe.
                    // Kui sokli ühendus on katkenud, väljastab see "false" alati.
                    if (!sokk.ConnectAsync(args)) collectData();
                }
                catch (Exception e)
                {
                    // handle error
                }
            }

private delegate EventHandler CompletedCall(object objekt, SocketAsyncEventArgs args);
            void Completed(object sender,SocketAsyncEventArgs args)
            {                
                collectData();
            }

private void collectData()
            {
                try
                {
                    if (CallBack == null) CallBack = new AsyncCallback(Receive);
                    // siin alustatakse andmete vastuvõttu pordist
                    asyncResult = sokk.BeginReceive(puhver, 0, puhver.Length, SocketFlags.None, CallBack, null);
                }
                catch (Exception e)
                {
                    // handle error
                }
            }

private void Receive(IAsyncResult asyn)
            {
                try
                {
                    // siin on sobiv koht pordist andmete lugemiseks, 
                    // pärast seda suundume uuesti andmeid ootama.
                    // kui sokkel on ühendamata, täidetakse samuti seda protseduuri, 
                    // kuid loetav tekst on alati tühi.
                    collectData();
                }
                catch (Exception e)
                {
                    // handle error
                }
            }

public bool connected { get { return sokk.Connected; } }
       }

Siin on kood, millega kontrollin sokli ühendatust:

    private void timer1_Tick(object sender, EventArgs e)
    {
    if (!sokkel.connected)            
        sokkel.ConnectAsync();  // see on asjatu, enam ühendust üles ei saa
    }

küsitud Nov 30 '09 at 13:52

Teet's gravatar image

Teet
7910

edited Nov 30 '09 at 22:39

Tundub, et natuke raske probleem sai...

(Nov 30 '09 at 22:25) Teet

Üldiselt sokkli ühendatuse testimine on üldiselt üsnagi ebausaldusväärne. Parem viis on midagi proovida kirjutada ja/või lugeda. vastav teema stackoverflows

socket.Disconnect(true);

Tagasi ühendamiseks võid proovida eelnevalt teha:

 sokkel.Shutdown(SocketShutdown.Both); 
 sokkel.Disconnect(true);

ja siis proovida ühendada.

link

vastatud Dec 01 '09 at 00:43

egon's gravatar image

egon ♦♦
71138

Suur tänu, see töötas, ning lahendas korraga mõlemad probleemid: sulges ühenduse korralikult siis, kui "connected" veel aktiivne oli, ning taastas ühenduse "disconnected" olekus.

(Dec 01 '09 at 09:06) Teet

kas TCP Keepalivest ei piisa?

link

vastatud Jan 03 '10 at 19:19

madis's gravatar image

madis
111

Kui serveri pool katkestab aeg-ajalt jõuga ühenduse, siis sellest ei piisa. Ma ei saa ehitada programmi, mille peab kinni panema ja uuesti käivitama, kui see ei ole enam suuteline oma katkise sokliga midagi peale hakkama.

(Jan 31 '10 at 23:34) Teet

seda just keepalive tagama peakski - katkise ühenduse (nagu näiteks jõuga suletud ühendus voolukatkestuse tõttu) tuvastama. Võid ka kõrgema taseme protokolli sarnase asja teha, nagu IRC protokolli puhul ping-pong näiteks on.

(Feb 03 '10 at 11:01) madis

Sul näiteks exception välja kommenteeritud. Kas ühenduse katekmine mingit exceptionit ei peagi viskama???

link

vastatud Jan 21 '10 at 14:49

laurts's gravatar image

laurts
1

Loomulikult on valmiskood märksa täiuslikum, viskasin siit välja selguse mõttes välja kõik üleliigse.

(Jan 31 '10 at 23:32) Teet
Sinu vastus
toggle preview

Jälgi seda küsimust

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or __italic__
  • **bold** or __bold__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Pinu tööpakkumised

kõik pakkumised »

Sildid:

×2
×1

küsitud: Nov 30 '09 at 13:52

nähtud: 659 korda

viimati uuendatud: Jan 21 '10 at 14:49

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee