Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Image in ListBox a Pingy

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

Aktivity (1)
Avatar
Зайчик
Člen
Avatar
Зайчик:16.1.2013 20:13

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:16.1.2013 20:18

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
Зайчик:16.1.2013 20:20

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
Зайчик:16.1.2013 20:48

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:16.1.2013 20:54

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
Зайчик:16.1.2013 22:16

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):16.1.2013 22:24

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)
Зайчик:16.1.2013 22:40

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
David Jančík [sczdavos]
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík [sczdavos]:16.1.2013 22:40

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):16.1.2013 22:50

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)
Зайчик:16.1.2013 23:17

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 Зайчик
Зайчик:16.1.2013 23:29

aha :)

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

:[
Díky

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

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]
Зайчик:16.1.2013 23:46

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):17.1.2013 0:11

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)
Зайчик:17.1.2013 0:28

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):17.1.2013 0:34

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)
Зайчик:17.1.2013 19:26

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
Зайчик:17.1.2013 19:33

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
Зайчик:17.1.2013 20:33

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):17.1.2013 20:42

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)
Зайчик:17.1.2013 21:16

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):17.1.2013 21:23

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
Odpovídá na Зайчик
David Čápka:17.1.2013 21:24

Použij třídu StopWatch :)

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
Зайчик:17.1.2013 21:30

ÁÁÁ 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]
Зайчик:20.1.2013 20:06

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
David Jančík [sczdavos]
Tým ITnetwork
Avatar
Odpovídá na Зайчик
David Jančík [sczdavos]:20.1.2013 20:11

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
Зайчик:20.1.2013 20:40

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.