locked
Socket connection to a IP NFC card reader RRS feed

  • Question

  • Hello,

    I am trying to create a 3rd party interface which will write to a NFC card via a network attached card encoder.

    The manufactures soultion /web dashboard is install on my Pc, and configured to attached the IP encoder to the list of available devices, and also set up to allow access to it via the the loopback address and a specific port.

    I have access to their "simulator", and I can use this to access the encoder and write a card. 

    I believe the simulator uses sockets as , when the companies service is not running on my PC, I get a asynchronous socket error message.

    With the service running, and the loop back address filled in, and port, the simulator encodes the card fine, So I know it can be done :-) .

    However, when I try it , my program says its connected, but I do not believe I have done it correctly as the program closed waiting on a response from the encoder (and I can launch the simulator and do not get an error re: socket /port being in use).

    IF I also supply it a false loopback address (127.0.0.2 ), it says its connected .... ?

    I was wondering if someone would be kind enough to point out what I am doing incorrectly / offer a better soultion ?

    using System;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    using System.Threading;
    
    namespace card2
        {
    
        // State object for receiving data from remote device.  
        public class StateObject
            {
            // Client socket.  
            public Socket workSocket = null;
            // Size of receive buffer.  
            public const int BufferSize = 256;
            // Receive buffer.  
            public byte[] buffer = new byte[BufferSize];
            // Received data string.  
            public StringBuilder sb = new StringBuilder();
            }
    
        public static class AsynchronousClient
            {
            // The port number for the remote device.  
            private const int port = 5010;
    
            // ManualResetEvent instances signal completion.  
            private static ManualResetEvent connectDone =
                new ManualResetEvent(false);
            private static ManualResetEvent sendDone =
                new ManualResetEvent(false);
            private static ManualResetEvent receiveDone =
                new ManualResetEvent(false);
    
            // The response from the remote device.  
            private static String response = String.Empty;
    
            private static void StartClient(string ipaddress)
                {
                // Connect to a remote device.  
    
                try
                    {
                    IPAddress ipAddress = IPAddress.Parse(ipaddress);
                    IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
                    Socket client = new Socket(ipAddress.AddressFamily,
                        SocketType.Stream, ProtocolType.Tcp);
                    client.BeginConnect(remoteEP,
                        new AsyncCallback(ConnectCallback), client);
                    connectDone.WaitOne();
    
                    // Send test data to the remote device.  
                    Send(client, "STX│CN│1│E│101│ETX 0DH");
                    sendDone.WaitOne();
    
                    // Receive the response from the remote device.  
                    Receive(client);
                    receiveDone.WaitOne();
    
                    // Write the response to the console.  
                    Console.WriteLine("Response received : {0}", response);
    
                    // Release the socket.  
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();
    
                    }
                catch (Exception e)
                    {
                    Console.WriteLine(e.ToString());
                    }
                }
    
            private static void ConnectCallback(IAsyncResult ar)
                {
                try
                    {
                    // Retrieve the socket from the state object.  
                    Socket client = (Socket)ar.AsyncState;
    
                    // Complete the connection.  
                    client.EndConnect(ar);
    
                    Console.WriteLine("Socket connected to {0}",
                        client.RemoteEndPoint.ToString());
    
                    // Signal that the connection has been made.  
                    connectDone.Set();
                    }
                catch (Exception e)
                    {
                    Console.WriteLine(e.ToString());
                    }
                }
    
            private static void Receive(Socket client)
                {
                try
                    {
                    // Create the state object.  
                    StateObject state = new StateObject();
                    state.workSocket = client;
    
                    // Begin receiving the data from the remote device.  
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback), state);
                    }
                catch (Exception e)
                    {
                    Console.WriteLine(e.ToString());
                    }
                }
    
            private static void ReceiveCallback(IAsyncResult ar)
                {
                try
                    {
                    // Retrieve the state object and the client socket
                    // from the asynchronous state object.  
                    StateObject state = (StateObject)ar.AsyncState;
                    Socket client = state.workSocket;
    
                    // Read data from the remote device.  
                    int bytesRead = client.EndReceive(ar);
    
                    if (bytesRead > 0)
                        {
                        // There might be more data, so store the data received so far.  
                        state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
    
                        // Get the rest of the data.  
                        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                            new AsyncCallback(ReceiveCallback), state);
                        }
                    else
                        {
                        // All the data has arrived; put it in response.  
                        if (state.sb.Length > 1)
                            {
                            response = state.sb.ToString();
                            }
                        // Signal that all bytes have been received.  
                        receiveDone.Set();
                        }
                    }
                catch (Exception e)
                    {
                    Console.WriteLine(e.ToString());
                    }
                }
    
            private static void Send(Socket client, String data)
                {
                // Convert the string data to byte data using ASCII encoding.  
                byte[] byteData = Encoding.ASCII.GetBytes(data);
                Console.WriteLine("Sending {0} to {1}.", data , client.RemoteEndPoint.ToString());
                // Begin sending the data to the remote device.  
                client.BeginSend(byteData, 0, byteData.Length, 0,
                    new AsyncCallback(SendCallback), client);
                }
    
            private static void SendCallback(IAsyncResult ar)
                {
                try
                    {
                    // Retrieve the socket from the state object.  
                    Socket client = (Socket)ar.AsyncState;
    
                    // Complete sending the data to the remote device.  
                    int bytesSent = client.EndSend(ar);
                    Console.WriteLine("Sent {0} bytes to server.", bytesSent);
    
                    // Signal that all bytes have been sent.  
                    sendDone.Set();
                    }
                catch (Exception e)
                    {
                    Console.WriteLine(e.ToString());
                    }
                }
    
            public static int Main(String[] args)
                {
                StartClient("127.0.0.1");
                return 0;
                }
    }
    }
    
    

    Thanks in Advance

    Wednesday, September 9, 2020 1:47 PM

Answers

  • Hi G-Oker,

    Thank you for posting here.

    It may be caused by the socket hanging in the TIME_WAIT state.

    Socket in use error when reusing sockets

    Best Regards,

    Timon


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • Marked as answer by G-Oker Friday, September 11, 2020 1:23 PM
    Thursday, September 10, 2020 8:20 AM

All replies

  • Hi G-Oker,

    Thank you for posting here.

    It may be caused by the socket hanging in the TIME_WAIT state.

    Socket in use error when reusing sockets

    Best Regards,

    Timon


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • Marked as answer by G-Oker Friday, September 11, 2020 1:23 PM
    Thursday, September 10, 2020 8:20 AM
  • Thank you Timon
    Friday, September 11, 2020 1:24 PM