2017-03-15 3 views
-2

Um Details vom Bankserver zu erhalten, werden sie mir die IP-und PORT-Nr. Ich benutze ISO8583 Nachrichtenformat (OpenIso8583 Bibliothek von NuGet Manager) zum Senden und Empfangen von Nachrichten.Bitte geben Sie mir Lösung, wie ISO8583 Nachrichten an Bank-Server mit IP-Adresse und Port-Nummer senden.Wie sende ich Nachricht im ISO8583-Format an Server mit C#

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; 
    } 

Antwort

0

Ihr erstes Problem ist in der Verpackung der Nachricht. Die Werte von msgdata [0] und msgdata [1] sollten ausgetauscht werden, andernfalls erwartet der Host weit mehr als das, was Sie senden.

Wie für den Teil, wo Sie auf eingehende Daten warten, hatte ich das gleiche Problem, wegen Paketfragmentierung. Ich habe ein OnReceived-Ereignis zu meinem Socket hinzugefügt, und innerhalb dieses Ereignisses hat mein erster Lesevorgang überprüft, ob die empfangenen Daten mehr als 1 Byte waren. Wenn dies der Fall ist, waren die ersten 2 Bytes meine Längenanzeige, und ich lese weiter und angehängt an einen Puffer, bis ich die Summe erreicht habe, wie durch die Längenanzeige angezeigt, oder bis eine Zeitüberschreitung aufgetreten ist. Ich tat dies, indem ich das OnReceived-Ereignis rekursiv wiederholte, bis keine Bytes mehr zum Lesen übrig waren.

Verwandte Themen