user2578216
user2578216

Reputation: 65

C# UDP Server talk with Client

I've tried multiple methods of doing this, and non seem to work out. But there must be a way.

What I'm trying to do (in C#) is create a server. I want the server to listen on a IP and port, and when it connects to a client, I want it to read what the client says, and send a reply. For the client, I want to connect to a server and send data, and receive the reply from the server.

How can I go about doing this?

I've used Microsoft examples and examples found on MSDN. They have Client > data > Server but it doesn't ever seem to include the server reply.

I know this can be done, obviously, because we have multiplayer games.

Thanks for the help.

EDIT - Code snippets

SERVER

static void Main(string[] args)
        {
            int recv;
            byte[] data = new byte[1024];

            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 904);
            Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            newSocket.Bind(endPoint);
            Console.WriteLine("Listening for connections...");

            //LISTEN FOR CLIENT
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 904);
            EndPoint tmpRemote = (EndPoint)sender;

            //READ MESSAGE FROM CLIENT
            recv = newSocket.ReceiveFrom(data, ref tmpRemote);
            Console.WriteLine("Messaged received from: " + tmpRemote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

            string welcome = "Welcome to server!";
            data = Encoding.ASCII.GetBytes(welcome);

            //SEND WELCOME REPLY TO CLIENT
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            sock.Bind(tmpRemote);
            sock.SendTo(data, tmpRemote);
            Console.WriteLine("Reply sent to client"); 
            
                

            while (true)
            {
                if(!newSocket.Connected)
                {
                    Console.WriteLine("Client disconnected.");
                    break;
                }

                data = new byte[1024];
                recv = newSocket.ReceiveFrom(data, ref tmpRemote);
                if (recv == 0)
                    break;

                Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

            }

            newSocket.Close();
            Console.WriteLine("Server disconnected.");
            Console.ReadLine();

        }
    }

CLIENT

 static void Main(string[] args)
        {
            Console.WriteLine("Message [127.0.0.1:904]: ");
            string msg = Console.ReadLine();
            byte[] packetData = ASCIIEncoding.ASCII.GetBytes(msg);
            string IP = "127.0.0.1";
            int port = 904;

            IPEndPoint ep = new IPEndPoint(IPAddress.Parse(IP), port);
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            client.SendTo(packetData, ep);
            Console.WriteLine("Data sent!");


            int recv;
            byte[] data = new byte[1024];
            EndPoint tmpRemote = (EndPoint)ep;

           while(true)
           {
               //READ MESSAGE FROM SERVER
               recv = client.ReceiveFrom(data, ref tmpRemote);
               Console.WriteLine("Messaged received from: " + tmpRemote.ToString());
               Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
           }

           client.Close();
           Console.WriteLine("Client disconnected.");
           Console.ReadLine();

        }

I can't get the server to talk back to the client and have the client read/display the server's reply.

Upvotes: 0

Views: 2092

Answers (1)

Lei Kan
Lei Kan

Reputation: 477

change this sentence

sock.SendTo(data, tmpRemote);

to

newSocket.SendTo(data, tmpRemote);

and remove these sentences, you have bind local EndPoint twice.

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.Bind(tmpRemote);

In Net, you can use UdpClient instead of Socket.

If you want a demo, look at this demo.

Upvotes: 1

Related Questions