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.
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.
#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
#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.
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);
}
#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);
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 :).
#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.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku