» »

Socket Server

Socket Server

abyssus ::

Torej, potrebujem strežnik, ki bo sprejemal client-e po protokolu TCP. Client je modul teltonika. Nekaj sem "spacal" (prepisal) z neta. Čisto osnovno stvar. Zadeva se seveda ne poveže. Sedaj bi rad testiral, če je Socket sploh OK. Kako to storiti?

Še ena stvar je: pomislil sem, da morda modem blokira povezave, zato sem 8001 port odprl (oz. vsaj mislil da ga sem).
Takole izgleda pod NAT sekcijo:

Bo tole ok?

Kakorkoli, C# koda:

public class Server
    {
        private readonly int _port;
        private TcpListener _tcpListener;
        private Thread _listenThread;
        private readonly IPAddress _hostAddress;

        public Server(string ipAddress, int port)
        {
            _hostAddress = IPAddress.Parse(ipAddress);
            _port = port;
        }

        public Server(int port)
        {
            //_hostAddress = GetIPAddress();
            _hostAddress = IPAddress.Any;
            _port = port;
        }

        public void Start()
        {
            _tcpListener = new TcpListener(_hostAddress, _port);
            _listenThread = new Thread(WaitForClient);

            _listenThread.Start();
            
            Console.WriteLine("Server IP: " + _hostAddress.MapToIPv4() + ", Port: " + _port);
            Console.WriteLine("waiting for client to connect...");
        }

        private void WaitForClient()
        {
            _tcpListener.Start();

            while (true)
            {
                var client = _tcpListener.AcceptTcpClient();
                Thread clienThread = new Thread(ClientCommunication);
                clienThread.Start(client);
            }
        }

        private void ClientCommunication(object client)
        {
            Console.WriteLine("client connected. waiting IMEI...");

            TcpClient tcpClient = (TcpClient) client;
            NetworkStream nstream = tcpClient.GetStream();

            byte[] msgBytes = new byte[4096];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    bytesRead = nstream.Read(msgBytes, 0, 4096);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    break;
                }

                if (bytesRead == 0)
                { 
                    Console.WriteLine("client disconnected...");
                    break;
                }

                ASCIIEncoding encoder = new ASCIIEncoding();
                Console.WriteLine(encoder.GetString(msgBytes, 0, bytesRead));
            }

            tcpClient.Close();
        }

        private IPAddress GetIPAddress()
        {
            string hostName = Dns.GetHostName();
            Ping ping = new Ping();
            var replay = ping.Send(hostName);
 
            if (replay.Status == IPStatus.Success)
            {
                return replay.Address;
            }

            return null;
         }
    }


Prosim za kakršnokoli pomoč, ker se s tem igram sedaj že veliko časa pa nimam nobenega rezultata. Hvala!

sandmat ::

oj,

na msdn imaš delujoče asinhronske in sinhronske server in client primere. Predlagam, da tisto predelaš.
Za začetek preveri, kateri hostname dobiš in testiraj na notranji mreži (brez kakih routerjev s port forwardingom).

Spura ::

Torej dal si address 192.168.1.20 in port 8001? In connectas se na ta address? Ti dela iz iste mreze? Za host address probaj IP "0.0.0.0"

Zgodovina sprememb…

  • spremenil: Spura ()

Red_Mamba ::

on mora poslusat na 192.168.1.20, kar je IP njegove masine kjer razvija (upam)
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

abyssus ::

Poslušam na IP-ju mašine, kjer razvijam - vendar je to IP znotraj moje mreže. Zunanji IP je seveda drugačen in tistega tudi podam v nastavitvah modula, skupaj z ustreznim port-om, ki ga pa dodam tam pod NAT. Upam, da delam to prav.

@sandmat, bom storil to. Sem že nekaj gledal te primere, vendar se jih nisem lotil proučevat. :) Hala.

Red_Mamba ::

ce imas moznost od zunaj probat se povezat enostavno preveris s telnet-om

telnet tvoj-zunanji-ip 8001
in bos videl ali ti ruter pravilno posilja pakete na lokalno masino

ce se ti poveze na server, potem zajec tici v kodi serverja ;)
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

Zgodovina sprememb…

abyssus ::

Danes končno le uspelo! Najprej sem zadevo testiral lokalno, nato sem se z telnetom spet lokalno poskusil povezat, ravno kar pa pustil še modul, da se poveže in mu je dejansko uspelo v zelo kratek času. Ne morem vam povedat, kako sem navdušen :D Hvala vsem! :D

Red_Mamba ::

bos pol vesel ko dobis racun po posti 8-)
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

abyssus ::

Zakaj račun? :o

Red_Mamba ::

za pomoc >:D
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

abyssus ::

Haha :D Daj na dva obroka :P

Red_Mamba ::

za tebe ni problema :D
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

fx ::

da ne odpiram nove teme bom tukaj vprašal. Napisal sem strežnik v c++ za unix/linux, ki deluje po principu chata oz. vsaki client prejme podatek, ki ga drugi client pošlje na strežnik. Prav tako sem napisal cliente v c++ (unix/linux) in c# (windows) in zadeva deluje. Clienti so programi, kateri komunicirajo z napravami, preko modbusa, canbusa, rs232 ali preko katerega drugega protokola. Zadeva sedaj deluje ko na mrežo pošiljam nize v ascii kodi. Sedaj me zanima, ali je možno da c++ client pošlje strukturo na mrežo preko strežnika na c# client in obratno in ga ob programa vesta pravilno prebrat in opravljat. s strukturo bi rad odpravil nepotrebno pretvarjanje niza v število ali v kateri drugi tip, kot je zapis iz ieee 754 v decimalno, ker to delam na strani posameznega clienta in ni potreba da podvajam čas in se mudim pri takih opravilh. ter lazje je narediti tudi filter posameznih paketov.

hvala za nasvete.
Lep pozdrav,

fx

Mavrik ::

Strukturo moraš pač prevesti v ustrezno obliko, ki jo bodo znali vsi prebrati - najsi je to JSON, protocol bufferji, flatbufferji. Ne moreš pa kar spomina dumpnit na žico in mislit da bo to kar delalo :)
The truth is rarely pure and never simple.

fx ::

To da bi direktno šlo poslati struktur mi je bilo jasno (razen pošiljanje niza gre direktno), predvsem iz tega razloga, dva različna programska jezika in različna okolja v katerih bosta tekla. Sedaj sem dobil kost in lahko naprej iščem in delam.

Hvala.
Lep pozdrav,

fx


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Arduino in luči (strani: 1 2 )

Oddelek: Elektrotehnika in elektronika
9811393 (9019) FX6300B
»

[C#] Client -> Server komunikacija dela, kako je pa z Server -> Client?

Oddelek: Programiranje
51178 (1044) Mitja Bonča
»

[Visual C#] zaradi while zanke se ne pokaže okno

Oddelek: Programiranje
8918 (795) Fresh-Grass
»

c# base class, derived class, inheritance problem

Oddelek: Programiranje
91328 (1207) Vapo1
»

C#; WebClient class; problem z uploadanjem

Oddelek: Programiranje
51367 (1326) 64202

Več podobnih tem