Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
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 Hartinger
Vlastník
Avatar
Odpovídá na Зайчик
David Hartinger: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
You are the greatest project you will ever work on.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Hartinger
Зайчик: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 Hartinger
Зайчик: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 Hartinger
Vlastník
Avatar
Odpovídá na Зайчик
David Hartinger: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
You are the greatest project you will ever work on.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Hartinger
Зайчик: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
https://www.facebook.com/peasantsandcastles/
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
Vlastník
Avatar
Odpovídá na Зайчик
David Jančík: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
Zapomeň, že je to nemožné a udělej to ;)
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
https://www.facebook.com/peasantsandcastles/
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
Vlastník
Avatar
Odpovídá na Зайчик
David Jančík: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
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Jančík
Зайчик: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
https://www.facebook.com/peasantsandcastles/
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
https://www.facebook.com/peasantsandcastles/
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
https://www.facebook.com/peasantsandcastles/
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
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Зайчик
David Hartinger:17.1.2013 21:24

Použij třídu StopWatch :)

Nahoru Odpovědět
17.1.2013 21:24
You are the greatest project you will ever work on.
Avatar
Зайчик
Člen
Avatar
Odpovídá na David Hartinger
Зайчик: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
Зайчик: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
Vlastník
Avatar
Odpovídá na Зайчик
David Jančík: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
Zapomeň, že je to nemožné a udělej to ;)
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.