0

I have looked through a lot of questions/answers related to my problem, but I couldn't fix it though.

My issue is about sending data(Strings in this example) through socket.

I have a Server class:

class Server
{
    Socket sock;
    Socket serverSock;
    byte[] buffer;
    string serverMsg;
    string clientMsg;
    int bytesRead;

    public void start()
    {
        buffer = new byte[1024];

        sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sock.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7777));
        sock.Listen(5);

        Console.WriteLine("Listening ---------------------");
        serverSock = sock.Accept();
        Console.WriteLine("Client accepted--------------------");


        //welcome message
        serverMsg = "WELCOME TO THE SERVER";
        buffer = ASCIIEncoding.Default.GetBytes(serverMsg);
        serverSock.Send(buffer);
        Console.WriteLine("Server message: " + ASCIIEncoding.Default.GetString(buffer));
        Array.Clear(buffer, 0, buffer.Length);

        //response message          
        while ((bytesRead = serverSock.Receive(buffer)) > 0)
        {
            clientMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
            Array.Clear(buffer, 0, buffer.Length);
        }

        Console.WriteLine("Client response: " + clientMsg);

        //Begin receiving user input from client
        while (true)
        {

            while ((bytesRead = serverSock.Receive(buffer)) > 0)
            {
                clientMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
                Array.Clear(buffer, 0, buffer.Length);
            }
            Console.WriteLine("Client message: " + clientMsg);

            //server response to user input
            serverMsg = clientMsg.Replace('b', 'p');
            buffer = ASCIIEncoding.Default.GetBytes(serverMsg);
            serverSock.Send(buffer);
            Console.WriteLine("Server message: " + ASCIIEncoding.Default.GetString(buffer));
            Array.Clear(buffer, 0, buffer.Length);
        }
    }
}

And a client class:

    class Client
    {
        Socket socketClient;
        string serverMsg;
        string clientMsg;
        byte[] buffer;
        int bytesRead;

        public void start()
        {
            buffer = new byte[1024];
            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socketClient.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7777));
            Console.WriteLine("Client connected-------------------");



            //receive welcome message from server
            while ((bytesRead = socketClient.Receive(buffer)) > 0)
            {
                serverMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
                Array.Clear(buffer, 0, buffer.Length);
            }
            Console.WriteLine("Server message: " + serverMsg);

            //response message
            clientMsg = "THANK YOU FOR YOUR GREETINGS";
            buffer = ASCIIEncoding.Default.GetBytes(clientMsg);
            socketClient.Send(buffer);
            Console.WriteLine("Client message: " + ASCIIEncoding.Default.GetString(buffer));
            Array.Clear(buffer, 0, buffer.Length);

            //Begin sending user input
            while (true)
            {
                clientMsg = Console.ReadLine();
                buffer = ASCIIEncoding.Default.GetBytes(clientMsg);
                socketClient.Send(buffer);
                Console.WriteLine("Client message: " + ASCIIEncoding.Default.GetString(buffer));
                Array.Clear(buffer, 0, buffer.Length);

                while ((bytesRead = socketClient.Receive(buffer)) > 0)
                {
                    serverMsg += ASCIIEncoding.Default.GetString(buffer).Trim('\0');
                    Array.Clear(buffer, 0, buffer.Length);
                }
                Console.WriteLine("Server response: "+serverMsg);
                Array.Clear(buffer, 0, buffer.Length);
            }
        }
    }

When I run my program I get the following outputs:

****Server output:** **

> Listening ---------------------
> Client accepted--------------------
> Server message: WELCOME TO THE SERVER

****Client output:** **

> Client connected-------------------

I know that my client is infinitely stuck in the loop that receives buffers.

*So how can I break from that loop ensuring that I receive the complete message?

*And is there a better (more general) approach for sending/receiving different data types through sockets?

Thank You

Yassir Khaldi
  • 1,452
  • 1
  • 17
  • 30
  • 1
    You can check my answer for similar problem here [http://stackoverflow.com/questions/41588439/client-server-socket-c-sharp/41588694#41588694](http://stackoverflow.com/questions/41588439/client-server-socket-c-sharp/41588694#41588694) – mrogal.ski Jan 11 '17 at 14:57
  • 2
    you need to learn about [message framing](http://blog.stephencleary.com/2009/04/message-framing.html), ask yourself *how does the client know "WELCOME TO THE SERVER" is the entire string the server is going to send and it is just not being delayed and a " MR. YASSIR" will be ariving any moment?* You need to tell the client when a message has ended, that telling is done via message framing. – Scott Chamberlain Jan 11 '17 at 15:00
  • @m.rogalski Thanks for the answer, I can see that you used the stream.ReadBytes() instead of socket.Receive(). can't we use the receive method though? – Yassir Khaldi Jan 11 '17 at 15:13
  • @ScottChamberlain Okay I'll check that link, thank you – Yassir Khaldi Jan 11 '17 at 15:16
  • @Yassir It all depends on your needs. You should always stick to the protocol ( using message framing ) though. – mrogal.ski Jan 11 '17 at 15:16
  • Although I will not mark my question as answered yet, just to wait for a clearer coded approach – Yassir Khaldi Jan 11 '17 at 15:18

0 Answers0