Przydzielanie wolnych socketów

0

Witam, nie będę opisywał wszystkiego, co chcę zrobić, tylko przejdę od razu do problemu.

Mam aplikację - w kliencie na stałe mam przypisany port, na serwerze to samo. Wiadomości dochodzą bez problemu. Chciałbym jednak włączyć drugiego, trzeciego, n-tego klienta i wszystko co wyślę z serwera, miałoby dotrzeć do każdego z klientów... na jednym porcie tego nie zrobię (chyba, że już tutaj źle myślę). W jaki sposób przydzielić taki socket, który nie jest na pewno wybrany w innym kliencie?

0

W jaki sposób przydzielić taki socket, który nie jest na pewno wybrany w innym kliencie?

Trzeba by napisać program, który to sprawdza hehe..
Ogólnie pomyśl o gniazdku jako o strumieniu, obszarze pamięci lub rejestrze DMA, uprości Ci to sprawę. Zadałeś pytanie, które sugeruje, że nie rozumiesz idei serwera lub zbyt mało szukałeś w internecie.

0

Mógłbyś napisać coś więcej? Nie proszę o gotowy kod, tylko o jakiś punkt zaczepienia, jestem początkujący i jest to moja pierwsza aplikacja tego typu. :)

0

Panowie, dziękuję za poprzednią pomoc, ale nadal walczę i zaraz chyba oszaleję. Czy początkujący zawsze mają takie chwile, że myślą już o odpuszczeniu sobie?

Najpierw mój kod:

tcpListener = new TcpListener(serverAdd, 10); //w konstruktorze

watekNasluchiwanie = new Thread(nasluchujKlientow);
watekOdbieranie = new Thread(odbierajWiadomosci);
watekNasluchiwanie.Start();

private void nasluchujKlientow()
        {
            while (true)
            {
                if (tcpListener.Pending())
                {
                    lock (listaKlientow)
                    {
                        listaKlientow.Add(new Klient(tcpListener.AcceptSocket()));
                        txtListaOsobPolaczonych.Text += "Nowy \r\n";
                    }
                    
                }
                txtWczytaneAukcje.Text += "+"; //żebym tylko widział jak się to dzieje, tymczasowo 
                Thread.Sleep(500);
            }
        }
private void odbierajWiadomosci() 
        {
            string s;
            while (true) 
            {
                lock (listaKlientow)
                {
                    foreach (Klient klient in listaKlientow)
                    {
                        networkStream = new NetworkStream(klient.Socket);
                        streamReader = new StreamReader(networkStream);

                        try
                        {
                            s = streamReader.ReadLine();
                            MessageBox.Show(s);
                        }
                        catch
                        {
                            break;
                        }
                    }
                }
                txtWczytaneAukcje.Text += "*"; //również tylko informacja dla mnie tymczasowa
                Thread.Sleep(500);
            }
        }

Uruchamiam serwer, wszystko ładnie idzie - pojawiają się gwiazdki i plusiki. Dołączam pierwszego klienta - wątek do odbierania wiadomości przestaje chodzić (stawiałem breakpointa na while, nawet się tam nie pojawia)... dołączam drugiego - wątek do nasłuchiwania przestaje chodzić i się nie dołącza do listy. Panowie, co robię źle? Już mi ten program sen z powiek spędza.

Jeśli zakomentuję włączenie wątku do odbierania wiadomości, to mogę połączyć ile chce klientów i wszystko jest dobrze. W czym problem?

Domyślam się, że to jakieś podstawy i pewnie takie pytania w dziale Newbie powinny lądować, ale wydaje mi się, że tutaj szybciej otrzymam pomoc.

Zapomniałbym dopisać - czy wpływ na to może mieć:

CheckForIllegalCrossThreadCalls = false;

?

Jest to tymczasowe rozwiązanie, jak dojdą mi pierwsze wiadomości od kilku klientów, to od razu robię to jak należy - tylko chciałbym mieć na początek jakiś punkt zaczepienia. Z tym lockiem to też tak wymyśliłem na poczekaniu, ale chyba jest to jest okej. Proszę o rady.

@Edit
Doszedłem do wniosku, że to ta linia powoduje problemy:

s = streamReader.ReadLine();

Ale co tutaj jest źle?

@edit2
Moje kolejne wnioski - metoda ReadLine() czeka aż coś przyjdzie... dopiero puszcza dalej. Ale to nie rozwiązuje mojego problemu... przecież ja chcę wyświetlić o ile coś dojdzie - może się okazać, że od tego klienta nie będę chciał nic otrzymać, co wtedy? Można ustawić "coś", co np. po kilku milisekundach puści metodę dalej?

Dlaczego:

MessageBox.Show(streamReader.Peek().ToString());

Przechodzi (na jeden raz, bo wysłaniu komunikatu)

A już

string s = streamReader.ReadLine();
MessageBox.Show(s);

ten kod nie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1