2017-03-15 81 views
-2

爲了從銀行服務器獲取詳細信息,他們將向我提供IP和端口號。我正在使用ISO8583消息格式(來自NuGet Manager的OpenIso8583庫)來發送和接收消息。請提供有關如何使用IP地址和端口號將ISO8583消息發送到銀行服務器的解決方案。如何以Iso8583格式向服務器發送消息使用c#

公共無效後(){

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

回答

0

你的第一個問題是在消息的包裝。 msgdata [0]和msgdata [1]的值應該交換,否則主機預期遠遠超過你發送的內容。

至於等待傳入數據的部分,由於數據包碎片,我遇到了同樣的問題。我所做的是將一個OnReceived事件添加到我的套接字中,並且在此事件中,我的第一次讀取檢查收到的數據是否多於1個字節。如果是這樣,前2個字節是我的長度指示符,並且我繼續讀取並追加到緩衝區,直到達到長度指示符指示的總數,或者直到發生超時。我通過遞歸地重新輸入OnReceived事件來做到這一點,直到沒有剩餘的字節被讀取。

相關問題