0
votes

I am working on the application which send and receive messages on UDP between client app and server app.

On my server I have 4 different network cards, e.g. nic1 = 169.524.15.12, nic2 = 169.524.15.65, etc. My DNS is point to nic2. The client app resolves the DNS and send data to nic2. However my server app sometime respond to client from nic1.

I'm using an UdpClient to listen for incoming packets.

This is my server application code:

objSocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint objEndPointOfServer =   new IPEndPoint(IPAddress.Any, 5000);
objSocketServer.Bind(objEndPointOfServer);
objSocketServer.BeginReceiveFrom(_arrReceivedDataBuffer, 0, BUFSIZE - 1, SocketFlags.None, ref objEndPointOfServer, DoReceiveFromClient, objSocketServer);

private void DoReceiveFromClient(IAsyncResult objIAsyncResult)
{
        try
        {
             // Get the received message.
            _objSocketReceivedClient = (Socket)objIAsyncResult.AsyncState;
            EndPoint objEndPointReceivedClient = new IPEndPoint(IPAddress.Any, 0);

            // Received data.
            int intMsgLen = _objSocketReceivedClient.EndReceiveFrom(objIAsyncResult, ref objEndPointReceivedClient);
            byte[] arrReceivedMsg = new byte[intMsgLen];
            Array.Copy(_arrReceivedDataBuffer, arrReceivedMsg, intMsgLen);

            // Client port.
            // Get and store port allocated to server1 while making request from client to server.
            int _intClientServer1Port = ((IPEndPoint)objEndPointReceivedClient).Port;

            // Send external ip and external port back to client.
            String strMessage = ((IPEndPoint)objEndPointReceivedClient).Address.ToString() + ":" + _intClientServer1Port.ToString();
            byte[] arrData = Encoding.ASCII.GetBytes(strMessage);
            objSocketServer.SendTo(arrData, arrData.Length, SocketFlags.None, objEndPointReceivedClient);

            // Start listening for a new message.
            EndPoint objEndPointNewReceivedClient = new IPEndPoint(IPAddress.Any, 0);
            objSocketServer.BeginReceiveFrom(_arrReceivedDataBuffer, 0, _arrReceivedDataBuffer.Length, SocketFlags.None, ref objEndPointNewReceivedClient, DoReceiveFromClient, objSocketServer)
        }
        catch (SocketException sx)
        {
                objSocketServer.Shutdown(SocketShutdown.Both);
                objSocketServer.Close();
        }
     }
}

Is there any way so that in code, I can detect that I have received packet on which IP address on server and revert with the response with same IP?

Arguably, I could resolve DNS in server app as well and make sure that my server app only listen to IP on which client app is sending packets, however that approach will not work for me when my server app have to listen on > 1 IP.

1

1 Answers

0
votes

The SendTo command will use the appropriate NIC (aka, local interface) for the destination address provided. The system metrics determine that. It's not something you set in your code. To view the system metrics, run the command netstat -rn and look at the Interface column. You many need to adjust those if you have a tie. You can enumerate them in code as well using GetAllNetworkInterfaces() and bind to a specific one (if that is what you wanted).