311 messaggi dal 25 novembre 2010
salve!
ho creato un piccolo client e un piccolo server socket a scopo didattico.
il client si connette e invia un messaggio che dovrebbe stampare il server e poi spedire indietro la risposta.
il client mi dice che ha inviato 17 bytes, quindi suppongo funzioni.
il server invece non sembra ricevere nulla.
CLIENT:
    class Client
    {
        public void socketClient(string host, int port)
        {
            int MAX_BUFFER = 500;
            Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socketClient.Connect(host, port);
            byte[] bytes = new byte[MAX_BUFFER];
            // SEND
            byte[] sendBytes = Encoding.UTF8.GetBytes("HELLO FROM CLIENT");
            int byteCount = socketClient.Send(sendBytes);
            Console.WriteLine("Sent {0} bytes.", byteCount);
            // RECEIVE
            byteCount = socketClient.Receive(bytes);
            if (byteCount > 0)
            {
                Console.WriteLine(Encoding.UTF8.GetString(bytes));
            }
        }
    }

SERVER:
        public void socketServer()
        {
            Console.WriteLine("SERVER SOCKET STARTED");
            int MAX_BUFFER = 500;
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Any, 20248));
            server.Listen(10); 
            while (true)
            {
                Console.WriteLine("WAITING FOR CONNECTION");
                Socket listenSocket = server.Accept();
                string receivedMessage = string.Empty;
                while (true)
                {
                    byte[] receivedBytes = new byte[MAX_BUFFER];
                    int bytesCount = listenSocket.Receive(receivedBytes);
                    receivedMessage += Encoding.ASCII.GetString(receivedBytes, 0, bytesCount);
                }
                Console.WriteLine(receivedMessage); // AVVISO
                byte[] replyaMessage = Encoding.ASCII.GetBytes("MESSAGE RECEIVED");
                listenSocket.Send(replyaMessage);
                listenSocket.Shutdown(SocketShutdown.Both);
                listenSocket.Close();
            }
            server.Close(); // AVVISO
        }
    }

visual studio 2012 (e non il 2010) mi da due warning dove ho messo i commenti.
mi dice solo che è stato rilevato codice non eseguibile.
qualche idea??
però mi dice solo
Forse manca un pezzo, ma non mi è chiaro come fai ad uscire dal secondo loop, dato che non fai altro che ricevere il messaggio e poi aspettarne subito un altro. Se effettui il debug e metti un breakpoint dopo socket.Accept e dopo Socket.Receive, ci passa?

Ciao

Il mio blog
Homepage
311 messaggi dal 25 novembre 2010
ciao e scusa il ritardo nella risposta.
ho modificato entrambi.
CLIENT:
    class Client
    {
        public void socketClient(string host, int port)
        {
            int MAXBUFFER = 1024;
            byte[] receivedBytes = new byte[MAXBUFFER];
            IPHostEntry ipHost = Dns.GetHostEntry(host);
            IPAddress ipAddress = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);
            Console.WriteLine("CLIENT STARTED");
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sender.Connect(ipEndPoint);
            Console.WriteLine("CONNECTED to {0}", sender.RemoteEndPoint);
            string sendingMessage = "HELLO";
            byte[] forwardMessage = Encoding.ASCII.GetBytes(sendingMessage + "\n");
            sender.Send(forwardMessage);
            int totBytesReceived = sender.Receive(receivedBytes);
            Console.WriteLine("REPLY FROM SERVER {0}", Encoding.ASCII.GetString(receivedBytes, 0, totBytesReceived));
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
            Console.ReadLine();
        }
    }

SERVER:
    class Server
    {
        public void socketServer()
        {
            int MAXBUFFER = 1024;
            Console.WriteLine("SOCKET STARTED");
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any, 20248));
            listener.Listen(10);
            while (true)
            {
                Console.WriteLine("WAITING CONNECTION");
                Socket socket = listener.Accept();
                string receivedMessage = string.Empty;
                while(true) 
                {
                    byte[] receivedBytes = new byte[MAXBUFFER];
                    int numBytes = socket.Receive(receivedBytes);
                    receivedMessage += Encoding.ASCII.GetString(receivedBytes, 0, numBytes);
                    if (receivedMessage.IndexOf("\n") > -1)
                    {
                        break;
                    }
                }
                Console.WriteLine("MESSAGE FROM CLIENT: {0}", receivedMessage);
                string replyMessage = "MESSAGE RECEIVED";
                byte[] replyBytes = Encoding.ASCII.GetBytes(replyMessage);
                socket.Send(replyBytes);
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            listener.Shutdown(SocketShutdown.Both);
            listener.Close();
        }
    }

adesso funziona.
quello che però non capisco è perchè mi dice "Rilevato codice non eseguibile" su queste righe:
            listener.Shutdown(SocketShutdown.Both);
            listener.Close();
497 messaggi dal 08 febbraio 2009
il motivo di quel messaggio è che quelle due righe sono dopo un ciclo "while (true)" che sembra non terminare mai
311 messaggi dal 25 novembre 2010
bhe deve essere così.
nel senso che fino a che nn lo decido il programma deve stare accesso per ricevere connessioni.
4 messaggi dal 22 giugno 2011
Anche se la discussione è vecchia aggiungo un risposta per futuri lettori.
La soluzione con while(true) non va bene, tutto il codice all'esterno è NON ESEGUIBILE perchè non c'è modo di poter raggiungere quelle righe durante l'esecuzione. Il nostro amico dice di voler fermare quando dice lui, ma non ha modo.
Benchè non ami assolutamente i cicli pseudo infiniti while(...) nel main, piuttosto li utilizzo come dirò tra un attimo, consiglio di inserirli sempre in thread o task paralleli. Fermare il codice main in una classe specifica non è molto elegante.
Tornando al codice "non eseguibile" prova così:

public bool exitFlag = true;

while (exitFlag)
{
    //fa qualcosa
}
Console.WriteLine("codice seguente");



A questo punto da "altrove", e qui sta il fatto che se metti tutto a giro di main non puoi intervenire, dovresti impostare exitFlag a false e il while termina.
Per il compilatore questa è una eventualità "possibile" quindi non dirà che il codice seguente è irraggiungibile.
E' ovvio che questa è una cosa a "grandi linee", solo per capire il perchè il compilatore risponde così.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.