Diskuze: Image in ListBox a Pingy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 28 zpráv z 28.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
Mě už se z toho nechce dělat ListView ( už jsem sním dost pracoval a je
všude )nepůjde to nějak
v tom ListBoxu?
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
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?
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í.
a mohl bys mi ukázat příklad jak to napsat asynchronně? 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
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;
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ý.
hmm to vypadá nadějně
ale asi jsem idiot nemůžu z toho nějak dostat PingReply abych měl ip a ms
Mrkni na tohle: https://dl.dropbox.com/…PingTest.zip
Edit: Sme to ještě upravil. Sem dost rozespalej, už nevim co píšu.
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 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
třeba neposílají ping, ale navážou spojení (a tvářej se jako hra)
jako že se mám zkusit připojit přes TCP? to zítra zkusím
Jj, kdyz to nejde pingem, pujde to takhle
Akorat si musis zjistit, na jakym portu jedou a pripojit se na nej.
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 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? :[
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?
EDIT : 3724 s tímhle portem to jde aha
:[
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";
}
}
Měřil bych normálně čas - před a po Connect, časy od sebe odečetl a vydělil dvěma.
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();
}
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.
ÁÁÁ super už to funguje díky o té třídě jsem neměl ani tucha
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áš
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š.
Zobrazeno 28 zpráv z 28.