一,關於Sockets協議的腳本,首先對報文的解析是一個關鍵,socket
報文的解析通常對着接口文檔,弄清楚每一個字段表明什麼意思,以下一段報文,放在data.ws中編碼
"\x00\x00\x01\x5C" // 報文長度348=15c,加上本身總長度 "1" "0" "500001" "0" "AUMS" "IBS " "2018061217982791000000" // 發起方流水,22位 "20180612" // 發起方日期,8位 "179827" // 發起方時間,6位 "G50704" //交易代碼 6位 "01" //網關錯誤標識2 " " // 網關錯誤代碼 7 " " //編碼1 " " //重發標誌1 " " //保留位1 6 "50704" //交易碼5 "20180612" //交易發生日期8 "12:12:12" //交易發生時間8 "17982790034 " //交易流水號22 "20161110" //交易日8 "0" //代理標誌1 "0000" //聯網行編號4 "8888 " //交易網點10 " " //櫃員10 " " //出納員號4 " " //受權櫃員1 10 " " //受權櫃員2 10 "3" //交易渠道 1 "0000 " //終端號 10 " " //返回碼類型 1 "T" //請求類型 1 "00" //受權級別 2 "1 " //當前第幾頁 8 "10 " //每頁記錄數 8 " " //備用1 20 " " //備用2 20 " " //備用3 20 " " //備用4 20 "6225683528000346164 " //銀行帳號 32 "Au99.99 " //合約代碼 10 "4011" //交易類型 4 "00015000" //委託價格 8 2 "1 " // 委託手數 6 "1" // 指令類型 1
二,是關於Sockets通訊協議,有必要了解一下長連接,短連接的區別spa
sockets報文以下代理
#include "lrs.h" Action() { int rc = 888; int RecBufLen; // 接收報文長度 char *RecBuf = NULL; // 接收報文內容 RecBuf = (char*)calloc(10240, sizeof(char)); lrs_set_connect_timeout(120, 0); lr_start_transaction("01_50704_委託報單"); // 完整事務 lr_start_transaction("01_50704_委託報單_創建發送通道鏈接"); rc = lrs_create_socket("MySocket","TCP","RemoteHost=21.96.22.56:14000",LrsLastArg); // 黃金系統ip:端口 if(rc == 0) { lr_end_transaction("01_50704_委託報單_創建發送通道鏈接", LR_PASS); } else { lr_end_transaction("01_50704_委託報單_創建發送通道鏈接", LR_FAIL); lr_error_message("01_50704_委託報單_創建發送通道鏈接失敗,錯誤碼是:%d", rc); lr_end_transaction("01_50704_委託報單", LR_FAIL); lrs_free_buffer(RecBuf); // 釋放空間 lrs_disable_socket("MySocket", DISABLE_SEND_RECV); // 關閉接口 lrs_close_socket("MySocket"); lr_exit(LR_EXIT_ITERATION_AND_CONTINUE, LR_FAIL); } lrs_set_send_timeout(120, 0); lrs_set_recv_timeout(120, 0); lrs_set_recv_timeout2(120, 0); lr_start_transaction("01_50704_委託報單_發送報文"); rc = lrs_send("MySocket", "SendBuf", LrsLastArg); if(rc == 0) { lr_end_transaction("01_50704_委託報單_發送報文", LR_PASS); } else { lr_end_transaction("01_50704_委託報單_發送報文", LR_FAIL); lr_error_message("01_50704_委託報單_發送報文失敗;錯誤碼是:%d;", rc); lr_end_transaction("01_50704_委託報單", LR_FAIL); lrs_free_buffer(RecBuf); // 釋放空間 lrs_disable_socket("MySocket", DISABLE_SEND_RECV); // 關閉接口 lrs_close_socket("MySocket"); lr_exit(LR_EXIT_ITERATION_AND_CONTINUE, LR_FAIL); } // 接受報文===================================================================== lr_start_transaction("01_50704_委託報單_接收報文"); rc = lrs_receive("MySocket", "ReceiveBuf", LrsLastArg); if((rc == 0)||(rc == 9101)) { lrs_get_last_received_buffer("MySocket", &RecBuf, &RecBufLen); if(RecBufLen>0) { lrs_save_param_ex("MySocket", "user", RecBuf, 0, RecBufLen, "ascii", "NewRecBuf"); // 接收的完整報文 lrs_save_param_ex("MySocket", "user", RecBuf, 112, 1, "ascii", "RetStatus"); // 接收的交易狀態 lrs_save_param_ex("MySocket", "user", RecBuf, 85, 7, "ascii", "RetCode"); // 接收的返回碼 lrs_save_param_ex("MySocket", "user", RecBuf, 92, 100, "ascii", "RetMsg"); // 接收的返回信息 lrs_save_param_ex("MySocket", "user", RecBuf, 21, 22, "ascii", "RetID"); // 接收返回的流水號 //lr_error_message("======接收的完整報文是:%s", lr_eval_string("<NewRecBuf>")); //lr_error_message("======發送的流水號是:%s", lr_eval_string("<DateTime><VuID><Num>")); //lr_error_message("======接收的流水號是:%s", lr_eval_string("<RetID>")); if (strcmp(lr_eval_string("<RetCode>"),"HJ0000 ") == 0) //if (strcmp(lr_eval_string("<RetStatus>"),"N") == 0) // N-交易成功;E-交易失敗;A-須要受權,交易未成功;W-警告(交易成功,返回提示信息);U-表示超時 { if (strcmp(lr_eval_string("<RetID>"),lr_eval_string("<DATE><TIME><VUER><UNIQ>")) == 0) // 發送流水號和接收流水號相同,防止串包 { lr_end_transaction("01_50704_委託報單_接收報文", LR_PASS); lr_end_transaction("01_50704_委託報單", LR_PASS); } else { lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL); lr_end_transaction("01_50704_委託報單", LR_FAIL); lr_error_message("01_50704_委託報單接收報文串包了!!!發送流水號是:%s,接收流水號是:%s,接收的完整報文是:%s", lr_eval_string("<DateTime><VuID><Num>"),lr_eval_string("<RetID>"),lr_eval_string("<NewRecBuf>")); } } else { lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL); lr_end_transaction("01_50704_委託報單", LR_FAIL); lr_error_message("01_50704_委託報單接收報文出錯!交易狀態是:%s,返回碼是:%s,返回信息是:%s,接收的完整報文是:%s", lr_eval_string("<RetStatus>"),lr_eval_string("<RetCode>"),lr_eval_string("<RetMsg>"),lr_eval_string("<NewRecBuf>")); } } else { lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL); lr_end_transaction("01_50704_委託報單", LR_FAIL); lr_error_message("01_50704_委託報單接收報文爲空!發送流水號是:%s", lr_eval_string("<DateTime><VuID><Num>")); } } else { lr_end_transaction("01_50704_委託報單_接收報文", LR_FAIL); lr_error_message("01_50704_委託報單_接收報文失敗;錯誤碼是:%d;", rc); lr_end_transaction("01_50704_委託報單", LR_FAIL); } lrs_free_buffer(RecBuf); // 釋放空間 lrs_disable_socket("MySocket", DISABLE_SEND_RECV); // 關閉接口 lrs_close_socket("MySocket"); return 0; }