Aplikacja sieciowa. Brak połączenia przez router

0

Witam wszystkich. Napisałem niedawno prostą aplikację, której zadaniem jest przesyłanie obrazu między komputerami w sieci. Aplikacja działa na adresie host bez problemu a także gdy do kompa podłącze bezpośrednio drugi komputer. Niestety jeśli podłącze drugi komputer przez router aplikacja nie chce się połączyć z serwerem. Próbowałem znaleŹć rozwiązanie lecz niestety nie mogę dojść dlaczego.
Jeśli chodzi o kod to podam to co jest w backgroundworkerach bo tam jest kod odpowiedzialny za połączenie i wysłanie.
Kod klienta

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            string host = textBox1.Text;  //adres z textboxa
            int port = Convert.ToInt16(numericUpDown1.Value); //nr portu z pola numerycznego
            try
            {
                TcpClient klient = new TcpClient(host, port);
                UstawTekst("Nawiazano polaczenie");
                NetworkStream ns = klient.GetStream();
                BinaryWriter pisanie = new BinaryWriter(ns);
                pisanie.Write("Witaj serwerze. Rozpoczynam wysyalnie zdjecia");
                pisanie.Write("wys");   //wysyła komendę. Jeśli serwer ją odbierze wie że wtedy ma uruchomić odbieranie zdjęcia
                pisanie.Write((int)tablicaZdjecia.Length);  //tablica zdjęcia jest tablicą typu byte[]
                pisanie.Write(tablicaZdjecia);
                pisanie.Write("Serwerze zdjecie zostalo wyslane");
                pisanie.Write("by");  //komenda pożegnalna
                klient.Close();
            }
            catch (Exception ex)
            {
                UstawTekst("Blad: nie udalo sie nawiazac polaczenia");
            }
        }

Kod serwera:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            IPAddress adresIP = null;
            try
            {
                adresIP = IPAddress.Parse(textBox1.Text);  //adres z textboxa
            }
            catch
            {
                MessageBox.Show("Zly format IP");
            }

            int port = Convert.ToInt16(numericUpDown1.Value);  //numer portu

            try
            {
                serwer = new TcpListener(adresIP, port);
                serwer.Start();
                klient = serwer.AcceptTcpClient();
                UstawTekst("Nawiazano polaczenie");
                button1.Enabled = false; //malo wazne
                button2.Enabled = true; //malo wazne
                NetworkStream ns = klient.GetStream();
                BinaryReader czytanie = new BinaryReader(ns);
                while (przerwanie == false)
                {
                    string s = czytanie.ReadString();
                    UstawTekst(s);
                    if (s == "wys")
                    {
                        UstawTekst("Otrzymano potwierdzenie wysylania obrazu przez klienta");
                        //tutaj zaczyna odbierać tablice zdjecia
                        int rozmiar = czytanie.ReadInt32();
                        tablicaZdjecia = czytanie.ReadBytes(rozmiar);
                        using (MemoryStream ms = new MemoryStream(tablicaZdjecia))
                        {
                            //tutaj przetwarza tablice na zdjęcie
                            Image zdjecie = Image.FromStream(ms);
                            UstawZdjecie(zdjecie);
                        }
                        //przeranie = true;
                    }
                    if (s == "by")
                        przerwanie = true;
                }
            }
            catch
            {
                UstawTekst("Blad inicjacji serwer");
            }
        }

Za wszelkie informację z góry dzięki

0

Musisz na routerze przekierować do odpowiedniego komputera port, na którym pracuje serwer.

0

Chodzi Ci w ustawieniach routera??
Nie da się tego zrobić drogą programową?? Bo przestawianie ustawień routera nie jest trudne ale jak np. mamy zwykle aplikacje internetowe np. komunikator, one nie potrzebują zmiany w ustawieniach routera tylko po prostu się łączą. Czy ja coś źle rozumuje??

0

ale przykladowe gg to łączy sie z wpierw z serwerem, a nie- server łączy się z Tobą.
Potem dane od klienta otrzymujesz poprzez server.
Tak samo, Ty poprzez router powinieneś połączyć się bez problemu, ale z Tobą poprzez router już pewnie nie. Moze nie masz adresu zewnętrznego

0

Jeśli chodzi o to kto z kim się łączy no to jest umowna sprawa. Bo można to rozgraniczyć tak jakby na klasy. Klasa serwer nasłuchuje i odbiera informację, klasa klient łączy się z klasą serwer i wysyła informację. Jeśli chcemy np. aby klient wysyłał informację budujemy aplikację klienta opartą jedynie na klasie klient a aplikację serwer na aplikacji serwer. Jednak jeśli chcemy aby klient odbierał i wysłał informację to musimy do aplikacji klienta dodać klasę za pomocą której będziemy mogli nasłuchiwać - czyli klasę serwer.
Nie wiem czy dobrze to wszystko rozumuje.
Co do adresu zewnętrznego. To wydaje mi się że tutaj mówimy o tym czy mam adres stały czy zmienny. Jeśli chodzi o sieć czy tutaj nie powinien się raczej liczyć adres bramy? Czy tutaj coś z tym nie powinienem zadziałać?
No i tutaj po raz kolejny nie wiem czy dobrze rozumuje. Więc proszę się na mnie nie denerwować:). Pozdrawiam

0

Dobrze rozumujesz. Tak, żeby nasłuchiwać połączeń od klientów potrzebujemy klasy "serwer". Ale żeby połączyć się z nasłuchującym na jakimś porcie na jakimś adresie IP serwerze musi istnieć możliwość połączenia się bezpośrednio z tym punktem.

Domowe routery, w 90% wypadków obecnie, robią translację adresów, tzw. NAT. Ze strony internetu jest jeden adres IP, a po stronie sieci domowej może być setki komputerów. Gdy ja łączę się z internetu, znam tylko IP routera, łączę się do routera - a nie wiem na którym komputerze działa serwer. Musi on być albo widoczny (poza routerem), albo router musi przekierować połączenie (port) do danego komputera na którym działa serwer.

Adres stały i zmienny nie mają znaczenia - ważne, czy tzw. publiczny, czy prywatny. Adres bramy nie ma dla serwera żadnego znaczenia.

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