Odblokovanie UdpClient.Receive() – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Odblokovanie UdpClient.Receive() – .NET – Fórum – Programujte.comOdblokovanie UdpClient.Receive() – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Tayson0
Stálý člen
14. 8. 2013   #1
-
0
-

Zdravim.

Neviete niekto poradit co spravit ak mi vybehuje chyba ze je blokovane UdpClient.Receive() ?

Ono to funguje do casu teda prijima data kym neodoslem nejake data a tie este odosle ale ked chcem znova prijimat tak vybehne error.

Nahlásit jako SPAM
IP: 85.237.239.–
liborb
~ Redaktor
+18
Guru
14. 8. 2013   #2
-
0
-

Pokud nechceš (opět) jenom obecnou odpověď na tvojí obecnou otázku, tak sem šoupni nejlépe kompletní ukázku kódu, kde se ta chyba projevu (včetně nastavení).

Nahlásit jako SPAM
IP: 188.75.135.–
Tayson0
Stálý člen
14. 8. 2013   #3
-
0
-

#2 liborb

public void listen()

{

client = new UdpClient(localPort);
host = new IPEndPoint(IPAddress.Any, 0);
while (Form1.button==true)

{

received = client.Receive(ref host);

receivedString = Encoding.ASCII.GetString(received);     

 writer = new StreamWriter(pathDesktop + @"\CLI_Log.txt", true);
 writer.Write(receivedString);
 writer.Close();
 tb.Invoke((MethodInvoker)delegate()
 {
  tb.AppendText(receivedString);
  });

}

}

No takze tuto metodu listen si spustam vo vlakne kde mi stale vycitava data cez UDP protokol. To vlakno si mozem pozastavit a znova spustit a stale mi to funguje.

Ako nahle si zavolam metodu pre odoslanie tak mi data odosle ale hore pri clien.receive() mi vybehne ze je blokovany.

Metoda send vyzera takto:

public void send()
        }
                client.Close();
                remoteEndPoint = new IPEndPoint(ip, remotePort);
                client = new UdpClient(remotePort);
                sendBytes = Encoding.ASCII.GetBytes(command + "\r\n");
                client.Send(sendBytes, sendBytes.Length, remoteEndPoint);
                   
        }

A vo forme si musim najprv zastavit vlakno odoslat data a znova spustit vlakno pretoze to zariadenie s ktorym komunikujem vie len bud prijimat data alebo odosielat nie naraz.

Vo forme to vyzera takto:

com.t.Suspend();
com.send();
com.t.Resume();

com je objekt triedy communication

Nahlásit jako SPAM
IP: 85.237.239.–
liborb
~ Redaktor
+18
Guru
14. 8. 2013   #4
-
0
-

Proč odeslání začínáš tím, že toho "klienta" zavřeš?   

Nahlásit jako SPAM
IP: 188.75.135.–
Tayson0
Stálý člen
14. 8. 2013   #5
-
0
-

#4 liborb
No pretoze mam dve rozdielene premenne kde si ukladam cisla portov. To znamena ze mozem pocuvat a zaroven prijimat na rozdielnych cislach portov. Tak preto si clienta zavriem pre prijem a vytvorim si noveho pre odoslanie. Tak preto to zacianm tym.

Nahlásit jako SPAM
IP: 85.237.239.–
Řešení
liborb
~ Redaktor
+18
Guru
14. 8. 2013   #6
-
0
-
Vyřešeno Nejlepší odpověď

To si to nejspíše špatně pochopil. Při odesílání nepotřebuješ měnit lokální port, na kterém posloucháš, takže send by mohl vypadat nejspíš následovně: 

public void send() {
	remoteEndPoint = new IPEndPoint(ip, remotePort);
	sendBytes = Encoding.ASCII.GetBytes(command + "\r\n");
	client.Send(sendBytes, sendBytes.Length, remoteEndPoint);                   
}
Nahlásit jako SPAM
IP: 188.75.135.–
Tayson0
Stálý člen
14. 8. 2013   #7
-
0
-

#6 liborb
Dakujem ti za pomoc pretoze som sa s tym uz velmi dlho hral a nemohol som prist na to kde mam problem. No asi mas pravdu ze som to zle pochopil. Takze v podstate ak to teraz dobre chapem tak pri pocuvani cez UDP si musim vytvorit:

client = new UdpClient(localPort);

A potom pocuvat data teda ich prijimat.

A ak chcem odosielat tak musim to spravit tak ako si napisal.

Ale nepochopil som preco tam nema byt toto

client = new UdpClient(remotePort);

Nahlásit jako SPAM
IP: 85.237.239.–
liborb
~ Redaktor
+18
Guru
14. 8. 2013   #8
-
0
-

Ten číselný parametr u konstruktoru značí číslo lokální portu, a to i v případě, že si tu proměnnou nazveš remotePort.

A vůbec jsem nepochopil, jak si to myslel s tím, že musíš zastavit příjem, když chceš vysílat, protože protizařízení umí buď jen přijímat nebo vysílat. Když to zařízení nebude nic vysílat, tak stejně nic nepřijmeš. Nehledě na to, že tebe se tohle omezení netýká. Leda bys měl zablokované tlačítko na odeslání po dobu, kdy chodí data, ale ty to podle mě máš obráceně. To jenom jako poznámka :).

Nahlásit jako SPAM
IP: 188.75.135.–
Tayson0
Stálý člen
14. 8. 2013   #9
-
0
-

#8 liborb
Aha takze toto

client = new UdpClient(localPort)

sa robi iba pri localnom porte na ktorom chcem pocuvat a nemusim vytvarat clienta pre port kde odosielam.

Preto ja som mal vytvoretene client = new UdpClient(remotePort) kde remotePort bola hodnota portu kde to druhe zariadenie prijima.

A to zariadenie ktore mam dokaze aj prijimat data ale aj odosielat. Problem je ale v tom ze ked prijimam data nemozem ich rovno odoslat ale musim zastavit prijimanie, odoslat data, a znovu zacat prijimat data. Nedokaze to robit naraz.

Nahlásit jako SPAM
IP: 85.237.239.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Podobná vlákna

Odblokovanie client.receive() — založil Tayson

Zmena portu udpclient. — založil Tayson

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý