Diskuze: Image in ListBox a Pingy

C# .NET .NET (C# a Visual Basic) Image in ListBox a Pingy American English version English version

Avatar
Зайчик
Člen
Avatar
Зайчик:

Zdravím, teď dělám takovou aplikaci , vlastně jsem už dost podobnou jednou dělal a kus práce mám už za sebou, ale teď mám problém. Chtěl bych pingovat servery a vypisovat status do ListBoxu jen jestli je server online nebo offline ( pomocí obrázků ) a textem vypisovat počet MS. ( textový výpis chci mimo listbox už ) Nicméně jako první zádrhel je, že nevím jak přidat obrázek do ListBoxu. Chtěl bych to nějak tak jak je to v příloze ( obrázky ). Přidám si název a adresu serveru a v ListBoxu budu mít zda je online / offline nebo jestli to čeká na pigování ( zelená, červená, šedá ). A druhý zádrhel je hned vedle v pingování. Vůbec nevím, jak pingovat server v C bych to vyřešil asi pomocí dosových funkcí

System("ping mujserver");

Ale bude určitě lepší metoda. Poradil by mi někdo? :) třeba takový sczdavos s těmi obrázky? Něco podobného dělal messengeru jako avatar ve friend listu. :) Budu rád za všechny rady díky. Tomáš

Odpovědět 16.1.2013 20:13
Коммунизм для нашего будущего!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Čápka:

Můžeš kouknout na ListView, ten se dá hodně uzpůsobit a umí ikonky, jen by možná musely být nalevo. Udělat si vlastní vykreslování komponenty není nic příjemného co si pamatuji.

A .NET by měl mít přímo třídu Ping :P

Nahoru Odpovědět 16.1.2013 20:18
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Čápka
Зайчик:

Mě už se z toho nechce dělat ListView ( už jsem sním dost pracoval a je všude :D )nepůjde to nějak v tom ListBoxu? :D

Nahoru Odpovědět 16.1.2013 20:20
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Čápka
Зайчик:

ty pingy už mám díky :) teď už jen ty obrázky :[

Nahoru Odpovědět 16.1.2013 20:48
Коммунизм для нашего будущего!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Čápka:

Půjde, ale musíš mu přepsat vykreslení. Je tam nějaká metoda OnDrawItem, zavoláš předka a poté vykreslíš ještě to kolečko. Koukni sem: http://stackoverflow.com/…awn-list-box

Nahoru Odpovědět 16.1.2013 20:54
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Čápka
Зайчик:

teď mám jakýsi problém s pingováním když se pinguje server, který je třeba offline tak se aplikace úplně sekne asi na 5sec což je celkem problém kód mám následovně a taky mi nefunguje pingovat hodně serverů... například wow.soulwell.cz mi pinguje krásně ale třeba logon.arena-tournament.com nebo wow.twinstar.cz mi nepinguje vůbec prostě to nefunguje. Nevíš proč? :(

Ping pingSender = new Ping();
if (ServerList.SelectedItem == null)
{
    PingReply reply = pingSender.Send("wow.soulwell.cz");
    if (reply.Status == IPStatus.Success)
    {
        ip.Text = reply.Address.ToString();
        ms.Text = reply.RoundtripTime.ToString() + "ms";
    }
    else
        ms.Text = "...";
}

Pokud se nevrátí nic od serveru tak do labelu ms zapíše "..." pokud ano vypíše se do ip - ip a do pingu počet ms. Ale problém je právně to sekání a to že to nepinguje hodně serverů :( nevíš co s tím? Možná na to sekání backgroundworker?

Nahoru Odpovědět 16.1.2013 22:16
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
Luboš Běhounek (Satik):

Pingání volej asynchronně, takhle se čeká, dokud nedostaneš odpověď nebo dokud nevyprší timeout, který je defaultně, nejspíš 5 sekund.

Některé servery mají ping zakázaný, s tím nic neuděláš, můžeš tak maximálně zkusit třeba načíst přes http stránku, jestli ti odpoví.

Editováno 16.1.2013 22:24
Nahoru Odpovědět 16.1.2013 22:24
:)
Avatar
Зайчик
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Зайчик:

a mohl bys mi ukázat příklad jak to napsat asynchronně? :D já jsem si zjistil že se to dá dělat takhle

Ping ping = new Ping();
PingReply neco = ping.Send("wow.twinstar.cz");
ms.Text = neco.RoundtripTime.ToString();

A pak jsem víš kde:D

Nahoru Odpovědět 16.1.2013 22:40
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
David Jančík [sczdavos]:

Tadyk si kreslím ty jednotlivé Tiles: http://www.itnetwork.cz/…list-a-mutex

Já sem pingování naposledy vyřešil tak, že sem si to dycky pingnul asynchronně a vrátil sme poslední info. To když sem chtěl čekovat připojení k netu.

public static bool connectionEstablished
{
        get
        {
                // asynchronní ping
                CheckInternetConnection();
                // poslední známá odpověď -> nastavuje se v on ping result eventu
                return pingResult;
        }
}

Ale možná by bylo lepší si v tom eventu vzít z e.Reply.Address něco takovýho by tam mělo bejt, kde adresa by měla bejt ta co jsi zadal a dle té si najdeš danou položku a změníš jí status.

V metodě ping nastavíš status -> Pinguje se
On result event -> podle úspěchu neúspěchu

'Nabourat' se do toho danýho okýnka přes Invoke to je taky někde v tom ISIMu popsaný. Si uděláš instanci toho formu a nebo si dáš (Application.OpenForms.OfType<MůjForm>().First().můjListView.Items[taj buď podle name nebo si najít index třeba LINQ dotazem] as MůjListView).Status = Status.Online;

Nahoru Odpovědět 16.1.2013 22:40
Čím více času dostaneš, tím méně ho máš.
Avatar
Luboš Běhounek (Satik):

Já si dělal vlastní pingač a používal jsem to takhle:

Volání pingu

Ping ping = new Ping();
ping.PingCompleted+=new PingCompletedEventHandler(ping_PingCompleted);
ping.SendAsync(tbTarget.Text, 5000);

Zpracování pingu

void ping_PingCompleted(object sender, PingCompletedEventArgs e)
{
    // zpracování e

    // nějaký vyčištění
    (sender as Ping).PingCompleted -= new PingCompletedEventHandler(ping_PingCompleted);
    (sender as IDisposable).Dispose();
    (sender as Ping).Dispose();
}

S tím uklízením pos sobě bacha, když jsem to neměl takhle složitě, tak mi po pár dnech aplikace, která jen pingala, a kreslila grafík, zabírala v paměti třeba 2 GB (z původních 30 MB)

S tímhle řešením už ten problém nenastal. Pak jsem někde vygooglil, že to byl nějaký bug a v novějších .NET už je snad opravený.

Nahoru Odpovědět 16.1.2013 22:50
:)
Avatar
Зайчик
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Зайчик:

hmm to vypadá nadějně :D ale asi jsem idiot nemůžu z toho nějak dostat PingReply abych měl ip a ms :D

Nahoru Odpovědět 16.1.2013 23:17
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Odpovídá na Зайчик
Зайчик:

aha :)

MessageBox.Show(e.Reply.Address.ToString());

:[
Díky

Nahoru Odpovědět 16.1.2013 23:29
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
David Jančík [sczdavos]:

Mrkni na tohle: https://dl.dropbox.com/…PingTest.zip

Edit: Sme to ještě upravil. Sem dost rozespalej, už nevim co píšu.

Editováno 16.1.2013 23:43
Nahoru Odpovědět 16.1.2013 23:38
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík [sczdavos]
Зайчик:

to vypadá dobře, každopádně pořád mám problém vždy když pinguju rovnou server tak to nefunguje funguje mi to jen na website :D to mi je bohužel k ničemu já potřebuju aby šla pingovat třeba tahle adresa

logon.arena-tournament.com

Zakázané to asi mají ale nějak to jde dělám aplikaci podle inspirace jiné aplikace a tam to běží bez problému takže to nějak jít musí:D

Nahoru Odpovědět 16.1.2013 23:46
Коммунизм для нашего будущего!
Avatar
Luboš Běhounek (Satik):

třeba neposílají ping, ale navážou spojení (a tvářej se jako hra)

Editováno 17.1.2013 0:12
Nahoru Odpovědět 17.1.2013 0:11
:)
Avatar
Зайчик
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Зайчик:

jako že se mám zkusit připojit přes TCP? :) to zítra zkusím

Editováno 17.1.2013 0:28
Nahoru Odpovědět 17.1.2013 0:28
Коммунизм для нашего будущего!
Avatar
Luboš Běhounek (Satik):

Jj, kdyz to nejde pingem, pujde to takhle :D
Akorat si musis zjistit, na jakym portu jedou a pripojit se na nej.

Nahoru Odpovědět 17.1.2013 0:34
:)
Avatar
Зайчик
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Зайчик:

No port si nezjistím ty se nejspíš nějak generují protože jde hra zapnout vícekrát a pokud vím kdyby byl jeden port jde to jen jednou z jednoho stroje.
Zkusil jsem následující :

public void SendData(string server)
        {
            sk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(/*server*/"logon.arena-tournament.com"), 1234);
            try
            {
                sk.Connect(iep);
            }
            catch
            {
                MessageBox.Show("smula nejde to");
            }
        }
        public void SendData2(string server)
        {
            IPAddress ipAddress = Dns.GetHostEntry(/*server*/"logon.arena-touornament.com").AddressList[0];
            try
            {
                TcpListener tcpListener = new TcpListener(ipAddress, 5000);
                tcpListener.Start();
            }
            catch
            {
                MessageBox.Show("nejde to");
            }
        }

Ani jeden z toho samozřejme nejde :D asice proto že je neplatná IP adresa u toho prvního hlavně proto že string alias "neco.neco.com" převádím na IP. Nějaké nápady jak to ještě upravit aby to už šlo? :[

Nahoru Odpovědět 17.1.2013 19:26
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Зайчик:

a takhle jsem to zkusil samozřejmě taky

server = "logon.arena-tournament.com";
            TcpClient tcpClient = new TcpClient ();
            try
            {
                tcpClient.Connect(server, 5000);
            }
            catch
            {
                MessageBox.Show("smula");
            }

je možné že je blbě jen port? :D

EDIT : 3724 s tímhle portem to jde :D aha :P :[

Editováno 17.1.2013 19:34
Nahoru Odpovědět 17.1.2013 19:33
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Зайчик:

tak a mám ještě poslední problém :) snažím se dostat z toho připojení počet milisekund (ms) z bodu A ( můj počítač ) do bodu B ( server ). A nějak se mi tahle hodnota nedaří dostat z toho spojení. Nevíte někdo co dělám blbě? Honota MS se vrátí vždy nulová.

public void SendData3(string server, out string address, out string ms)
        {
            address = ms = "";
            TcpClient tcpClient = new TcpClient ();
            try
            {
                tcpClient.Connect(server, 3724);
                address = "connected";
                ms = tcpClient.ReceiveTimeout.ToString();
            }
            catch
            {
                address = "disconnected";
            }
        }
Nahoru Odpovědět 17.1.2013 20:33
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
Luboš Běhounek (Satik):

Měřil bych normálně čas - před a po Connect, časy od sebe odečetl a vydělil dvěma.

Nahoru Odpovědět 17.1.2013 20:42
:)
Avatar
Зайчик
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
Зайчик:

no tak udělal jsem to takhle xD ale to mi příjde jako blbost to není žádná metoda, která mi vyvolá latenci?

TcpClient tcpClient = new TcpClient ();
            try
            {
                int start = DateTime.Now.Millisecond;
                tcpClient.Connect(server, 3724);
                int end = DateTime.Now.Millisecond;
                if(end > start)
                    latence = end - start;
                else
                    latence = start - end;
                ms = latence.ToString();
                connected = tcpClient.Connected.ToString();
            }
            catch
            {
                connected = tcpClient.Connected.ToString();
            }
Nahoru Odpovědět 17.1.2013 21:16
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
Luboš Běhounek (Satik):

Máš to špatně, milliseconds každou sekundu běžej znova od nuly do 1000.

Neukládej si milisekundy, ale celej DateTime a pak z rozdílu vytahuj totalmilliseconds.

Nahoru Odpovědět 17.1.2013 21:23
:)
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 17.1.2013 21:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Čápka
Зайчик:

ÁÁÁ super už to funguje díky :) o té třídě jsem neměl ani tucha :P

Nahoru Odpovědět 17.1.2013 21:30
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík [sczdavos]
Зайчик:

Hoj, prosím tě vytvořil jsem si třídu, funkce na asynchronní tcp připojení k serveru. Což funguje parádně, ale bohužel IPEndPoint mi nechce brát DNS ale vyžaduje pouze IP adresu, potřeboval bych pomoc. Tady je asynchronní tcp připojení k serveru.

public void Send(string ip)
        {
            Socket newsock = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), 3724);
            newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
        }
        void Connected(IAsyncResult result)
        {
            client = (Socket)result.AsyncState;
            try
            {
                client.EndConnect(result);
                // connected
            }
            catch
            {
                // disconnected
            }
        }

A potřeboval bych to volat další funkcí, kde se mi DNS adresy změní na IP. To už jsem taky měl ->

string dns = "wow.arena-tournament.com";
IPAddress[] address = Dns.GetHostAddresses(dns);

foreach (IPAddress ip in address)
{
   mojeip = ip;
}
Send(mojeip);

To fungovalo přesně tak, jak jsem chtěl. Problém je ale že to není asynchronně tzn je mi to k ničemu protože se mi pak zasekává aplikace. Nemáš nějakou zkušenost s tím udělat asynchronně tuhle funkci? :(

Tomáš

Editováno 20.1.2013 20:07
Nahoru Odpovědět 20.1.2013 20:06
Коммунизм для нашего будущего!
Avatar
Odpovídá na Зайчик
David Jančík [sczdavos]:

Moc sme se nedíval na ten kód, ale zkus to hodit na další thread.

Thread t = new Thread(ThreadStart(() => { MojeFce(parametr, parametr2); }));
t.Start();

Pokud je metoda bez parametru stačí zadat její jméno. Jinak pomocí () -> lamda nadefinuješ řádkovou fci a tam si můžeš dávat co chceš.

Nahoru Odpovědět 20.1.2013 20:11
Čím více času dostaneš, tím méně ho máš.
Avatar
Зайчик
Člen
Avatar
Зайчик:

zdá se že to funguje :) díky ;) teď to ještě nějak upravit do drawitemu v listviewu :D kdyžtak se zas zeptám :[

Nahoru Odpovědět 20.1.2013 20:40
Коммунизм для нашего будущего!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 28 zpráv z 28.