• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Odpowiedź z serwera przy wewnętrznym/prywatnym IP.

Object Storage Arubacloud
0 głosów
322 wizyt
pytanie zadane 26 czerwca 2018 w Sieci komputerowe, internet przez kubekszklany Gaduła (3,190 p.)
zamknięte 5 lipca 2018 przez kubekszklany

Witam. Po wielu próbach udało mi się wysłać pakiet i odebrać go na innym komputerze, o co pytałem tutaj. Umieściłem server na VPS'ie, uruchomiłem clienta i tu pojawił się kolejny problem. Moje IP, jak i zapewne wielu użytkowników internetu jest wewnętrzne/prywatne, nie wiem jak to się w zupełności nazywa, ale chodzi o to, że nie jestem w stanie tak po prostu wysłać odpowiedzi do clienta. Nie muszę utrzymywać połączenia stałego, wystarczy mi jednorazowo wysłana odpowiedź. Używam Udp (ponieważ Tcp wymaga utrzymywania połączenia), a obydwie aplikacje (client i server) napisane są w c#.
Jak więc wysłać odpowiedź z servera do clienta?

komentarz zamknięcia: Rozwiązane.
komentarz 1 lipca 2018 przez mbady Obywatel (1,280 p.)
Mini podpowiedź na szybko, jeśli klient ma adres tzw. publiczny to może przesłać w pakiecie UDP swój adres i port na którym oczekuje odpowiedzi od serwera. Jeśli oba są w sieci prywatnej to można użyć trzeciego serwera pośredniczącego do komunikacji.
komentarz 2 lipca 2018 przez kubekszklany Gaduła (3,190 p.)
Próbowałem już, ale po odesłaniu odpowiedzi na ten sam ip i port klient jej nie dostaje, albo nie odbiera, musiałbym chyba wszystkie porty nasłuchiwać.
komentarz 3 lipca 2018 przez mbady Obywatel (1,280 p.)
Wrzuć gdzieś swój kod.
komentarz 3 lipca 2018 przez kubekszklany Gaduła (3,190 p.)
https://stackoverflow.com/questions/51058381/how-to-send-packet-to-client-with-private-ip To samo pytanie w wersji angielskojęzycznej, tam jest kod client i server.
komentarz 4 lipca 2018 przez mbady Obywatel (1,280 p.)
edycja 4 lipca 2018 przez mbady
Czy ten kod działa ci lokalnie, tzn czy jak masz uruchomiony serwer i klienta na jednym komputerze, to czy to ci działa, bo jak nie, to znaczy, że coś nie tak jest z kodem?

Napisz jeszcze, czy używasz .NET Framework, czy .NET Core.

1 odpowiedź

0 głosów
odpowiedź 4 lipca 2018 przez mbady Obywatel (1,280 p.)
wybrane 5 lipca 2018 przez kubekszklany
 
Najlepsza

Witaj, poproszę ciebie abyś wykonał test uruchamiając poniższy kod.

Pamiętaj aby w opcjach VS ustawić minimum c# 7.1, gdyż ta wersja zawiera sygnaturę asynchroniczną dla Main.

Napisałem ten mini kod dla klienta i serwera używając podejścia asynchronicznego ale w teście tym chodzi o to abyś uruchomił część serwerową oraz osobno część klienta (należy odkomentować odpowiedni kod linie 12 i 13) tylko po to aby sprawdzić, czy działa minimum wysyłania i odbierania, a problem nie leży gdzieś we fragmencie kodu, który uruchamia twój kod, bo może dochodzi do zablokowania i oczekiwania na jakimś wywołaniu, a nie na problemach z komunikacją poprzez sieć.

Poniższy kod sprawdzałem lokalnie ale powinien działać też w twojej konfiguracji (ustaw odpowiednio adres ip serwera w kodzie klienta  bo jest ustawiony na "127.0.0.1"). W zależności jakiego windowsa używasz (no chyba że uruchamiasz to na linuksie) to może się pojawić okienko do zatwierdzenia zgody do komunikacji programu (ja tak miałem, wystarczy wybrać odpowiednie ustawienie).

using System.Collections.Generic;
using System.Threading.Tasks;

namespace UdpClientServer
{
    class ConsoleMain
    {
        static async Task Main(string[] args)
        {
            var tasks = new List<Task>();

            //tasks.Add(Server.RunAsync()); // uncomment for server side
            //tasks.Add(Client.RunAsync()); // uncomment for client side

            await Task.WhenAll(tasks);
        }
    }
}
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace UdpClientServer
{
    public class Server
    {
        public static async Task RunAsync()
        {
            var localEndPoint = new IPEndPoint(IPAddress.Any, 8080);
            var server = new UdpClient(localEndPoint);

            var result = await server.ReceiveAsync();
            var message = Encoding.ASCII.GetString(result.Buffer);

            System.Console.WriteLine($"from client: {result.RemoteEndPoint}");
            System.Console.WriteLine($": {message}");

            // send message back to client

            var welcome = Encoding.ASCII.GetBytes($"Welcome on server, your message: {message}");

            await server.SendAsync(welcome, welcome.Length, result.RemoteEndPoint);
        }
    }
}
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace UdpClientServer
{
    public class Client
    {
        public static async Task RunAsync()
        {
            var remoteAddress = IPAddress.Parse("127.0.0.1");
            var remoteEndPoint = new IPEndPoint(remoteAddress, 8080);
            var message = Encoding.ASCII.GetBytes($"Hello I am a client");

            var client = new UdpClient();
            
            await client.SendAsync(message, message.Length, remoteEndPoint);

            var result = await client.ReceiveAsync();
            var message2 = Encoding.ASCII.GetString(result.Buffer);

            System.Console.WriteLine($"from server: {result.RemoteEndPoint}");
            System.Console.WriteLine($": {message2}");
        }
    }
}

 

Uruchom odpowiednio programiki i powiedz, czy serwer odesłał wiadomość do klienta, rezultat powinien być jak poniżej.

Po stronie serwera:

from client: 127.0.0.1:50451
: Hello I am a client


Po stronie klienta:

from server: 127.0.0.1:8080
: Welcome on server, your message: Hello I am a client

 

komentarz 5 lipca 2018 przez kubekszklany Gaduła (3,190 p.)

Emm... Program nie zawiera statycznej metody „Main” odpowiedniej jako punkt wejścia. Gdybyś mógł mi to gdzieś wysłać, np. kubekszklany@o2.pl bo coś mam chyba inaczej w projekcie i mi to się nie chce skompilować... Jak tworzyłem projekt wybrałem aplikacje konsolową i .NET Framework 4.7.1

komentarz 5 lipca 2018 przez mbady Obywatel (1,280 p.)

Zaznaczyłeś to: Pamiętaj aby w opcjach VS ustawić minimum c# 7.1, gdyż ta wersja zawiera sygnaturę asynchroniczną dla Main.

Zaznaczasz swój projekt, następnie "Properties", zakładka "Build", przycisk "Advanced..." i tam wybierasz "Language version", powinna być minimum c# 7.1.

komentarz 5 lipca 2018 przez kubekszklany Gaduła (3,190 p.)


To o to chodziło czy nie? Bo mam VS po polsku. Jeżeli o to chodziło to miałem już ustawione 4.7.1, i nie działało.

komentarz 5 lipca 2018 przez mbady Obywatel (1,280 p.)

To nie ta zakładka, wybrałeś "Aplikacja", a powinieneś następną czyli "Buduj/Budowanie" i tam szukać pod przyciskiem "zaawansowane" możliwości ustawienia wersji języka.

 

komentarz 5 lipca 2018 przez kubekszklany Gaduła (3,190 p.)
Działa! :) Dobra to teraz z twojego kodu skopiuję chyba skoro mój nie działa. Dzięki wielkie!
komentarz 5 lipca 2018 przez mbady Obywatel (1,280 p.)
Pamiętaj, że ten kod jest mocno testowy miał tylko wykazać, czy problem jest po stronie sieciowej, czy kodu. Wychodzi, że kodu. To że jest napisany asynchronicznie to nie znaczy że tak musi być, no chyba, że ci tak pasuje.

Zerknij jeszcze raz na swój kod może znajdziesz podobieństwa i/lub może to być jeszcze problem blokowania kodu, który wykonuje się w innym wątku itp/itd.

Ale skoro działa to znaczy, że to nie problem sieci.

Podstawę masz, to teraz rozwijaj...

Podobne pytania

0 głosów
1 odpowiedź 1,275 wizyt
+1 głos
1 odpowiedź 1,310 wizyt
0 głosów
0 odpowiedzi 325 wizyt

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...