📄 smppclient.cs.svn-base
字号:
{
disconnectSocket();
Thread.Sleep(reconnectTimeout);
if (mustBeConnected)
{
smscArray.NextSMSC();
connectToSMSC();
}
}
catch (Exception ex)
{
logMessage(LogLevels.LogExceptions, "tryToReconnect | " + ex.ToString());
}
}//tryToReconnect
private void receiveCallback(IAsyncResult ar)
{
try
{
int _command_length;
uint _command_id;
int _command_status;
int _sequence_number;
int _body_length;
byte[] _PDU_body = new byte[0];
byte[] _RESPONSE_PDU = new byte[KernelParameters.MaxPduSize];
int i, x;
bool _exit_flag;
// Retrieve the state object and the client socket
// from the async state object.
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
// Read data from the remote device.
int bytesRead = client.EndReceive(ar);
logMessage(LogLevels.LogSteps, "Received " + Tools.ConvertIntToHexString(bytesRead) + " bytes");
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
if ((LogLevel & LogLevels.LogPdu) > 0)
logMessage(LogLevels.LogPdu, "Received Binary Data " + Tools.ConvertArrayToHexString(state.buffer, bytesRead));
//////////////////////////////
/// Begin processing SMPP messages
///
mLen = mPos + bytesRead;
if (mLen > KernelParameters.MaxBufferSize)
{
mPos = 0;
mLen = 0;
mbResponse = new byte[KernelParameters.MaxBufferSize];
}
else
{
Array.Copy(state.buffer, 0, mbResponse, mPos, bytesRead);
mPos = mLen;
_exit_flag = false;
x = 0;
while (((mLen - x) >= 16) && (_exit_flag == false))
{
_command_length = mbResponse[x + 0];
for (i = x + 1; i < x + 4; i++)
{
_command_length <<= 8;
_command_length = _command_length | mbResponse[i];
}
_command_id = mbResponse[x + 4];
for (i = x + 5; i < x + 8; i++)
{
_command_id <<= 8;
_command_id = _command_id | mbResponse[i];
}
_command_status = mbResponse[x + 8];
for (i = x + 9; i < x + 12; i++)
{
_command_status <<= 8;
_command_status = _command_status | mbResponse[i];
}
_sequence_number = mbResponse[x + 12];
for (i = x + 13; i < x + 16; i++)
{
_sequence_number <<= 8;
_sequence_number = _sequence_number | mbResponse[i];
}
if ((_command_length <= (mLen - x)) && (_command_length >= 16))
{
if (_command_length == 16)
_body_length = 0;
else
{
_body_length = _command_length - 16;
_PDU_body = new byte[_body_length];
Array.Copy(mbResponse, x + 16, _PDU_body, 0, _body_length);
}
//////////////////////////////////////////////////////////////////////////////////////////
///SMPP Command parsing
switch (_command_id)
{
case 0x80000009:
logMessage(LogLevels.LogSteps, "Bind_Transiver_Resp");
if (connectionState== ConnectionStates.SMPP_BIND_SENT)
{
if (_command_status == 0)
{
connectionState= ConnectionStates.SMPP_BINDED;
logMessage(LogLevels.LogSteps, "SMPP Binded");
}
else
{
logMessage(LogLevels.LogSteps | LogLevels.LogErrors, "SMPP BIND ERROR : " + Tools.ConvertIntToHexString(_command_status));
disconnect(client);
tryToReconnect();
return;
}
}
else
{
logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "ERROR #3011 : Unexpected Bind_Transiver_Resp");
}
break;
case 0x80000004:
logMessage(LogLevels.LogSteps, "Submit_Sm_Resp");
SubmitSmRespEventArgs evArg = new SubmitSmRespEventArgs(_sequence_number, _command_status, Tools.ConvertArrayToString(_PDU_body, _body_length - 1));
processSubmitSmResp(evArg);
break;
case 0x80000103:
logMessage(LogLevels.LogSteps, "Data_Sm_Resp");
evArg = new SubmitSmRespEventArgs(_sequence_number, _command_status, Tools.ConvertArrayToString(_PDU_body, _body_length - 1));
processSubmitSmResp(evArg);
break;
case 0x80000015:
logMessage(LogLevels.LogSteps, "Enquire_Link_Resp");
enquireLinkResponseTime = DateTime.Now;
break;
case 0x00000015:
logMessage(LogLevels.LogSteps, "Enquire_Link");
sendEnquireLinkResp(_sequence_number);
break;
case 0x80000006:
logMessage(LogLevels.LogSteps, "Unbind_Resp");
connectionState= ConnectionStates.SMPP_UNBINDED;
disconnect(client);
break;
case 0x00000005:
logMessage(LogLevels.LogSteps, "Deliver_Sm");
decodeAndProcessDeliverSm(_sequence_number, _PDU_body, _body_length);
break;
case 0x00000103:
logMessage(LogLevels.LogSteps, "Data_Sm");
decodeAndProcessDataSm(_sequence_number, _PDU_body, _body_length);
break;
default:
sendGenericNack(_sequence_number, StatusCodes.ESME_RINVCMDID);
logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Unknown SMPP PDU type" + Tools.ConvertUIntToHexString(_command_id));
break;
}
///////////////////////////////////////////////////////////////////////////////////////////
///END SMPP Command parsing
///////////////////////////////////////////////////////////////////////////////////////////
if (_command_length == (mLen - x))
{
mLen = 0;
mPos = 0;
x = 0;
_exit_flag = true;
}
else
{
x += _command_length;
}
}
else
{
sendGenericNack(_sequence_number, StatusCodes.ESME_RINVMSGLEN);
mLen -= x;
mPos = mLen;
Array.Copy(mbResponse, x, mbResponse, 0, mLen);
_exit_flag = true;
logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Invalid PDU Length");
}
if (x < mLen)
logMessage(LogLevels.LogPdu, "NEXT PDU STEP IN POS " + Convert.ToString(x) + " FROM " + Convert.ToString(mLen));
}
}
//////////////////////////////
/// End processing SMPP messages
// Get the rest of the data.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(receiveCallback), state);
}
else
{
logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Incoming network buffer from SMSC is empty.");
/* if (client.Poll(0,SelectMode.SelectError)&&client.Poll(0,SelectMode.SelectRead)&&client.Poll(0,SelectMode.SelectWrite))
{
logMessage(LogLevels.LogSteps|LogLevels.LogExceptions, "Socket Error");
unBind();
}
*/
tryToReconnect();
}
}
catch (Exception ex)
{
logMessage(LogLevels.LogExceptions, "receiveCallback | " + ex.ToString());
unBind();
}
}//receiveCallback
private void initClientParameters()
{
mbResponse = new byte[KernelParameters.MaxBufferSize];
mPos = 0;
mLen = 0;
enquireLinkResponseTime = DateTime.Now;
undeliveredMessages = 0;
}//initClientParameters
private void decodeAndProcessDeliverSm(int sequence_number, byte[] _body, int _length)
{
if (_length < 17)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RINVCMDLEN);
return;
}
try
{
bool isDeliveryReceipt = false;
bool isUdhiSet = false;
byte _source_addr_ton, _source_addr_npi, _dest_addr_ton, _dest_addr_npi;
byte _priority_flag, _data_coding, _esm_class;
byte[] _source_addr = new byte[21];
byte[] _dest_addr = new byte[21];
byte saLength, daLength;
byte[] _short_message = new byte[0];
int _sm_length;
int pos;
/////////////////////////////////////
/// Message Delivery Params
///
byte[] _receipted_message_id = new byte[254];
byte _receipted_message_id_len = 0;
byte _message_state = 0;
Int16 sar_msg_ref_num = 0;
byte sar_total_segments = 0;
byte sar_segment_seqnum = 0;
pos = 0;
while ((pos < 5) && (_body[pos] != 0x00))
pos++;
if (_body[pos] != 0x00)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x01");
return;
}
_source_addr_ton = _body[++pos];
_source_addr_npi = _body[++pos];
pos++;
saLength = 0;
while ((saLength < 20) && (_body[pos] != 0x00))
{
_source_addr[saLength] = _body[pos];
pos++;
saLength++;
}
if (_body[pos] != 0x00)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x02");
return;
}
_dest_addr_ton = _body[++pos];
_dest_addr_npi = _body[++pos];
pos++;
daLength = 0;
while ((daLength < 20) && (_body[pos] != 0x00))
{
_dest_addr[daLength] = _body[pos];
pos++;
daLength++;
}
if (_body[pos] != 0x00)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -