Jak wysłać synchronicznie dwie ramki UDP?

Jak wysłać synchronicznie dwie ramki UDP?
VA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
1

Witam,

chcę napisać komunikację z inną aplikacją wykorzystując protokół UDP.
Ten kod działa jeśli metoda Main wygląda tak:

Kopiuj
static async Task Main(string[] args)
{
    Program p = new Program();

    await p.Run();
}

Używam wireshark do monitorowania komunikacji, wysyłam pakiet a aplikacja zewnętrzna odsyła odpowiedź, wszystko wygląda ok.
Problem zaczyna się kiedy chcę przesłać dwie ramki jedna za drugą:

Kopiuj
{
    Program p = new Program();

    await p.Run();
    await p.Run();
}

Wtedy zostaje wysłana tylko pierwsza (odpowiedź przychodzi prawidłowa).

Jeszcze ciekawiej robi się kiedy ta klasa jest biblioteką i kod:

Kopiuj
{
    Program p = new Program();

    await p.Run();
}

podpinam pod button w formatce, po kilku wywołaniach wyglądających na poprawne, wireshark przestaje pokazywać wysyłane ramki.
Wtedy nawet wylogowanie z win11 nie pomaga, muszę restartować system.

Coś chyba jest namieszane w wątkach/taskach
proszę o jakieś sugestie jak to rozwiązać.

Kod klasy:

Kopiuj
namespace AsyncAwait
{
    class Program
    {
        private UdpConnect _udpConnect;

        public Program()
        {
			_udpConnect = setParam(RemoteAddress, LocalPort, RemotePort);
        }
		
        private void Print(string txt)
        {
            string dateStr = DateTime.Now.ToString("HH:mm:ss.fff");
            Console.WriteLine($"{dateStr} Thread #{Thread.CurrentThread.ManagedThreadId}\t{txt}");
        }
        private async Task Run()
        {
            Print("Program Start");

            await SendUDP(); //.Wait();
            await ReceiveUDP();

            Print("Program End. Press any key to quit");
            Console.Read();
        }
        private async Task SendUDP()
        {
            _udpConnect.Connect();

            Print("SendUDP");

            _udpConnect.Send(BitConverter.GetBytes(199));

            Print("SendUDP End");
        }
        private async Task ReceiveUDP()
        {
            _udpConnect.Read();

            Print("ReceiveUDP");

            _udpConnect.Disconnect();

            Print("ReceiveUDP End");
        }

        static async Task Main(string[] args)
        {
            Program p = new Program();

            await p.Run();
            await p.Run();
        }
    }
}

Pozdrawiam.

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 342
0

Po co ci Console.Read() w metodzie run? Nie znam tej biblioteki ale raczej nie powinieneś robić Connect przy każdym wysłaniu.

VA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Po usunięciu Console.Read() zadziałało.
Zaraz sprawdzę czy będzie tak samo kiedy ta klasa będzie biblioteką.

Adin napisał(a):

Nie znam tej biblioteki ale raczej nie powinieneś robić Connect przy każdym wysłaniu.

Masz rację, zaczynam dopiero coś robić w oparciu o "System.Net.Sockets.UdpClient"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.