0

In order to get details from the bank server they will provide me the IP and PORT no. I am using ISO8583 messaging format (OpenIso8583 library from NuGet Manager) to send and receive messages.Please provide me solution on how to send ISO8583 messages to bank server using IP Address and Port number.

public void post() {

        var msg = new Iso8583();
        msg.MessageType = Iso8583.MsgType._0200_TRAN_REQ;

        //Following feilds are mandotary to get balanace info
        msg[Iso8583.Bit._003_PROC_CODE] = "820000";//balanace enquery
        msg[Iso8583.Bit._102_ACCOUNT_ID_1] = "0021210020320000069";//bankid(002)branchid(121)accnumber(0020320000069)           

        //send iso message to server
        var response = NetworkSend("192.32.179.171", 45510, msg);//ipaddress,port,msg

        if (response[Iso8583.Bit._039_RESPONSE_CODE] == "000")
        {
              //success

            // read data of iso message
        }

    }

    private static Iso8583 NetworkSend(string ip, int port, Iso8583 msg)
    {

        // We're going to use a 2 byte header to indicate the message length
        // which is not inclusive of the length of the header
        var msgData = new byte[msg.PackedLength + 2];

        // The two byte header is a base 256 number so we can set the first two bytes in the data 
        // to send like this
        msgData[0] = (byte)(msg.PackedLength % 256);
        msgData[1] = (byte)(msg.PackedLength / 256);

        // Copy the message into msgData
        Array.Copy(msg.ToMsg(), 0, msgData, 2, msg.PackedLength);

        // Now send the message.  We're going to behave like a terminal, which is 
        // connect, send, receive response, disconnect
        var client = new TcpClient();
        var endPoint = new IPEndPoint(IPAddress.Parse(ip), port);
        client.Connect(endPoint);
        var stream = client.GetStream();

        // Send the packed message
        stream.Write(msgData, 0, msgData.Length);

        // Receive the response

        // First we need to get the length of the message out of the socket
        var lengthHeader = new byte[2];
        stream.Read(lengthHeader, 0,2);//this line giving error

        // Work out the length of the incoming message
        var rspLength = lengthHeader[0] * 256 + lengthHeader[1];
        var rspData = new byte[rspLength];

        // Read the bytes off the network stream
        stream.Read(rspData, 0, rspLength);

        // Close the network stream and client
        stream.Close();
        client.Close();

        // Parse the data into an Iso8583 message and return it
        var rspMsg = new Iso8583();

        rspMsg.Unpack(rspData, 0);
        return rspMsg;
    }
Vinay D
  • 21
  • 1
  • 4

2 Answers2

2

Your first problem is in the packing of the message. The values of msgdata[0] and msgdata[1] should be swapped around, otherwise the host is expecting far more than what you are sending.

As for the part where you wait for incoming data, I've had the same problem, because of packet fragmentation. What I did was to add an OnReceived event to my socket, and inside this event, my first read checked if the data received was more than 1 byte. If so, the 1st 2 bytes were my length indicator, and I kept on reading and appending to a buffer until I reached the total as indicated by the length indicator, or until a timeout occurred. I did this by recursively re-entering the OnReceived event until there were no bytes left to read.

JohanE
  • 143
  • 1
  • 7
0

here is a method to send iso message over network

public static string Send(Iso8583 msg, string IP, int Port)
{
    var messagebits = msg.ToMsg();
    string result = "";
    try
    {
        TcpClient tcpclnt = new TcpClient();
        tcpclnt.Connect(IP, Port);
        Stream stream = tcpclnt.GetStream();

        ASCIIEncoding asen = new ASCIIEncoding();
        stream.Write(messagebits, 0, messagebits.Length);

        var lengthHeader = new byte[2];
        stream.Read(lengthHeader, 0, 2);

        var rspLength = lengthHeader[0] * 256 + lengthHeader[1];
        var rspData = new byte[rspLength];

        stream.Read(rspData, 0, rspLength);
        tcpclnt.Close();
        Iso8583 msgIso = new Iso8583();
        msgIso.Unpack(rspData, 0);
    }
    catch (Exception) { }
    return result;
}
david
  • 3,225
  • 9
  • 30
  • 43