none
Restare in ascolto da server (HTPP - get) RRS feed

  • Domanda

  • Salve a Tutti.

    Ho un apparato di rete (gateway SMS) che comunica il proprio aggiornamento di stato tramite comunicazioni GET (indirizzo locale 192.168.3.67). Il mio IP locale è 192.168.3.1 mentre il mio router è il 254. Devo implementare un codice che resti in attesa di comunicazioni da questo dispositivo.

    Ho implementato questo codice (spezzone di una classe)

                

    [..] //costruttore della classe

                IPAddress localIP = IPAddress.Parse(GetLocalIPAddress());
                Int32 listenerPort = 80;
                IPEndPoint listenerEndpoint = new IPEndPoint(localIP, listenerPort);

                TcpListener tcpListener = new TcpListener(listenerEndpoint);

                StarttcpListenerThread(tcpListener);

            }

            private static void StarttcpListenerThread(TcpListener tcpListener)
            {

                tcpListener.Start();
                Thread tcpListenerThread = new Thread(() =>
                {
                    while (true)
                    {
                        try
                        {
                            byte[] bytes = new byte[1024];
                            TcpClient currentConnection = tcpListener.AcceptTcpClient(); //Entra qui e rimane li senza mai ricevere dati
                            NetworkStream stream = currentConnection.GetStream();
                            int numBytesReadFromStream = stream.Read(bytes, 0, bytes.Length);
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message);
                        }

                    }
                });
                tcpListenerThread.Start();
            }

    Di default la porta di comunicazione è la 80. Tentando pero, come da codice postato, di far girare il programma ottengo un errore : System.Net.Sockets.SocketException: 'Tentativo di accesso al socket con modalità non consentite dalle rispettive autorizzazioni di accesso'.

    Cambiando porta, ad esempio 82, l'errore sparisce ma non ricevo mai nessuna comunicazione, sia attendendo le notifiche periodiche che ho settato ogni 5 sec, sia forzando tramite browser una risposta sulla porta 82 (http://192.168.3.67:82/goip_get_status.html); questa chiamata sulla porta 80 invece restituisce correttamente i dati sul browser.

    Ho anche aperto la porta 82 sul router per l'indirizzo del gateway (192.168.3.67) anche se credo non serva in quanto stiamo comunicando all'interno della rete LAN, senza cioè uscire da essa.

    Temo a qeusto punto di aver sbagliato qualcosa nel codice e chiedo a Voi cortesemente se avete qualche suggerimento.


    Ringrazio anticipatamente chi vorra dedicarmi il suo tempo.

    Buona serata


    mercoledì 3 luglio 2019 16:55

Tutte le risposte

  • Usualmente la porta 80 di un PC è usata dal webserver, pertanto se hai IIS o APACHE o altro webserver installato la porta 80 è usata, altrimenti è chiusa sul Firewall di sistema, è sempre suggerito che le device che utilizzano il TCP o comunque i socket dovrebbero usare porte superiori alla 40000 sarebbe opportuno che tu cambiassi la porta su cui trasmette il tuo apparato, usandone una diversa. se devi per forza usare la 80, controlla che non ci sia IIS o altro webserver installato sulla macchina, e controlla sul firewall configurando la porta 80 per la ricezione e trasmissione tramite il tuo software.

    Solitamente la configurazione degli apparati dovrebbe permettere di modificarne la porta di trasmissione e ricezione.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 4 luglio 2019 09:22
  • Grazie per la tua risposta Sabrina C. e scusa se non mi sono più fatto vivo.

    La risposta fornita non mi è sembrata molto attinente a quanto richiesto, probabilmente non mi sono spiegato bene nel formulare la domanda.

    In realtà il problema è che quel codice non funziona perché C# non è in grado di leggere sulle porte. Per aggirare il problema ho dovuto implementare uno sniffer all'interno del programma usando la libreria PcapDotNet.

    Grazie comunque per il tuo contributo

    mercoledì 2 ottobre 2019 10:41