[2.9.17] - 2022-04-12
- Extension method SmppClient.RetryUntilBindAsync
[2.9.16] - 2022-01-20
- ReceivedRequestQueueLimit doesn't work
- sometimes SubmitAsync hangs when the server drops the connection
[2.9.15] - 2022-01-11
- SmppServer is now sealed class
- Remove unused CancellationToken parameter from SmppServer.StopAsync method
- default SmppClientBase.ReceiveTaskScheduler to TaskScheduler.Default
- Performance for developer version
- several warnings in the code
[2.9.14] - 2021-08-31
- NullReferenceException warning on accepting connection when server disconnects the newly connected client.
- SmppClientBase.Dispose doesn't free internal objects when connection is already closed.
[2.9.13] - 2021-07-30
- endless repetition of sending in the SubmitWithRepeatAsync extension method
[2.9.12] - 2021-07-01
- unnecessary delay on success submit in the SubmitWithRepeatAsync extension method
- The metric client.Metrics.Sent.Requests.PerSecond reports incorrect results.
[2.9.11] - 2021-06-24
- When client disconnects the PDU packets that already received from network stream must be processed.
- Better logging for disconnect routine
- When client receives corrupted response PDU with readable SMPP Header and non-ok status, return this response in corresponding method and write the warning into the log.
[2.9.10] - 2021-06-12
- SmppClient. memory leak in SMPP connection.
- SmppClient. Deadlock on disconnection in Windows Forms application for in .NET Framework.
[2.9.9] - 2021-05-13
- Performance. Default buffer size was 4096 bytes. This significantly reduces the throughput. Now default buffer size is 65536 for send and receive.
- SmppServer. SendBufferSize and ReceiveBufferSize properties changed in SmppServerClient in evClientConnected event handler are not applied to Socket buffer size.
- SmppServer. SmppServer may hang when stopped.
- SmppServer. Missing binds after failed accept connection.
- SmppClient. When remote side drops the connection, the response status SMPPCLIENT_RCVTIMEOUT maybe returned instead of SMPPCLIENT_NOCONN.
- SmppClientBase. Don't disconnect when remote side doesn't response on our EnquiryLink request, but send any other request PDU.
[2.9.8] - 2021-04-28
- wrong User Data Length with 16-Bit concatenation
[2.9.7] - 2021-04-12
- Developer License. Unable to cast object of type 'System.Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider'
[2.9.6] - 2021-04-09
- Tag property to SmppClientBase class to associate any data with the client.
[2.9.5] - 2021-03-18
- SmppClient.SubmitWithRepeatAsync extension method for sending single SubmitSm.
- SmppClient.ConnectAsync(SmppConnectionOptions) method with extended connection options
- SmppConnectionOptions.SinglePDUinTCPPacket allows to send each PDU in single TCP packet
- new async methods in SmppServer class: StartAsync, StopAsync, RunAsync
- SmppServerClient.Status is Closed in the event SmppServer.evClientConnected
- InvalidOperationException on SmppServer.Stop
[2.9.4] - 2021-02-06
- Incorrect length of ShortMessage for the first part in the concatenated message when using NationalLanguageSingleShift user data header.
[2.9.3] - 2021-02-04
[2.9.2] - 2021-02-01
- Incorrect length of ShortMessage for concatenated message part when using NationalLanguageSingleShift user data header.
[2.9.1] - 2021-01-29
- SmppServerClient.RemoteEndPoint is null when client connection is accepted.
[2.9.0] - 2021-01-25
- MMS m-notification-ind and m-delivery-ind over SMPP
- WorkersTaskScheduler class creates worker threads to handle received requests for a client.
- ReceiveTaskScheduler property in SmppClientBase class. Received requests can be handled in individual or global TaskScheduller or in standard TaskScheduler.Default.
By default client uses WorkersTaskScheduler with 3 worker threads.
- RetryUntilConnectedAsync extension method for SmppClient class that helps to establish connection when a SMPP server is temporary unreachable.
- SubmitBatchAndWaitForDeliveryAsync extension method for SmppClient class that helps to submit a batch of SubmitSm PDUs and receive all delivery receipts.
- SubmitWithRepeatAsync extension method that help to repeat the SubmitSm requests on disconnection or unsuccess reponse status.
- Target Framework changed from .NET 4.5.2 to .NET 4.6.1
- SmppClientBase.SendQueueLimit limits a number of requests waiting for response. When this limit is exceeded, SubmitAsync method is blocked until queue has a free slot.
- Less GC pressure by reusing reading buffer.
- Improve DeliverReceipt deserialization when received PDU has wrong DataCoding.
- Deliver receipt serializer enriches DeliverSm PDU with optional parameters (MessageState, ReceiptedMessageId, NetworkErrorCode) only when PDU was not received from remote side.
- Throws GenericNackSmppException when GENERICK_NACK response received in Submit methods.
- Throws ObjectDisposedException when trying to call public method on disposed classes SmppClientBase, SmppClient, SmppServerClient
- New implementation of SMPP connection that frees all used resources after disconnect.
- Improved batch submit. Send several PDUs in one TCP packet.
- ArgumentNullException in MessageComposer by adding a PDU with empty text
- SmppClientBase.SendSpeedLimit sends more than allowed PDUs when run SubmitAsync in tasks.
- GSMEncoding returns wrong number of bytes for Turkish charset when both NationalLanguageLockingShift and NationalLanguageSingleShift are specified.
- Text splitting. The maximum length of the short_message field is not used if NationalLanguageSingleShift is enabled.
- evConnected event from SmppClientBase class. SmppClient is connected after call of the method ConnectAsync or on the event evRecoverySucceeded. SmppServer has own method evClientConnected.
- Obsolete properties from PDU classes.
- QueueState class and SmppClientBase.Queue property. Use SmppClientBase.Metrics instead.
- SmppClientBase.WorkerThreads property. Set the SmppClientBase.ReceiveTaskScheduler property to the instance new WorkersTaskScheduler(3).
[2.8.6] - 2020-11-19
[2.8.5] - 2020-11-12
- NationalLanguageLockingShift user data header
[2.8.4] - 2020-11-12
- license file Inetlab.SMPP.license must contain product name. Generate new license file in your Inetlab Account.
- write license loading errors in license status.
[2.8.3] - 2020-11-04
- failed to verify license on macos
[2.8.2] - 2020-09-01
- inaccurate SendSpeedLimit on the machine with high-resolution performance counter.
[2.8.1] - 2020-06-16
- SendSpeedLimit and result speed has significant difference.
- Send Queue can be blocked in some edge cases.
- Reconnect doesn't start when ThreadPool is overloaded
- Race condition in MessageComposer causes NullReferenceException
[2.8.0] - 2020-04-02
- SendResponseAsync method in SmppClientBase class. Response sending can be prevented in a event handler by changing it to null. req.Response = null;
- Extension method CanBeEncoded to validate an Encoding for given text message
- MessageComposer with persistence storage interface to save message parts in external database instead of memory.
- NullReferenceException in the event evFullMessageReceived of MessageComposer class
- Setup Project: Unable to update the dependencies of the project. The dependencies for the object 'Inetlab.SMPP.dll' cannot be determined.
[2.7.1] - 2020-01-20
- move InterfaceVersion property to the SmppClientBase class
- GenericNack PDU has not been sent when wrong PDU header is received.
[2.7.0] - 2019-12-11
- Added Metrics property for SmppClientBase class.
- Support of 16 bit concatenation parameters in SMS builder classes.
- ReceiveSpeedLimit with rate limiting. Measure PDU count for defined time unit instead of interval between PDUs.
- rename async-methods according to the dotnet naming conventions
- InactivityTimeout starts when SmppServerClient is connected and EnquireLinkInterval is not defined for this client.
- Generate long number MessageId for SubmitSmResp and SubmitMultiResp. According to SMPP Protocol MessageId should contain only digits.
- Timeout timer in MessageComposer restarts when next segment of the message is received.
- Submit hangs after unexpected disconnect.
- Exception by changing send or receive buffer size.
- SmppTime.Format for relative time.
- OverflowException in GSMEncoding.
- Support of .NET Standard 1.4
- InactivityTimeout from SmppClient
[2.6.14] - 2019-09-20
- SmppTime.Format for relative time.
- exception in demo applications
[2.6.13] - 2019-08-14
- multithread-issue with ConnectedClients in SmppServer class
- set SmppClient.SystemID and SmppClient.SystemType properties when client is bound.
[2.6.12] - 2019-07-26
- convert UserDataHeader to and from byte array
- SmppTime functions for formatting and parsing scheduled delivery times and expiry times in PDU.
- EnsureReferenceNumber method that sets next reference number for a list of concatenated PDUs.
- property InactivityTimeout in the class SmppClientBase. Default is 2 minutes. Connection will be dropped when in specified period of time no SMPP message was exchanged.
InactivityTimeout doesn't work when EnquireLinkInterval is defined.
- SmppServer: when client.ReceiveSpeedLimit is set to any value, first message is always throttled.
- text splitting: Incorrect message length of 1st PDU when text encoded in GSM encoding and contains extended characters
- ReferenceNumber=0 for submitted concatenated PDUs.
[2.6.11] - 2019-04-20
- Connection failed. Error Code: 10048. Only one usage of each socket address (protocol/network address/port) is normally permitted. Occurs when call Connect method from different threads at the same time.
[2.6.10] - 2019-04-19
- exceptions by incorrect disconnect.
[2.6.9] - 2019-04-15
- Request property is null in received response PDU class.
- ReceiveBufferSize and SendBufferSize properties for SmppClientBase.
[2.6.8] - 2019-03-27
- wrong text splitting in SMS builder for GSMPackedEncoding.
[2.6.7] - 2019-03-27
- StackOverflowException by submitting array of SubmitMulti.
- destination addresses serialization for SubmitMulti
- short message length calculation
[2.6.6] - 2019-03-25
- exception in GetMessageText method for DeliverSm with empty text.
[2.6.5] - 2019-03-18
- exception in GetMessageText method for DeliverSm without receipt.
[2.6.4] - 2019-03-15
- missed last character in the last segment of the concatenated message created with SMS builders.
- Extension method smppPdu.GetMessageText(EncodingMapper) as replacement for MessageText property in a PDU class.
- TLVCollection.RegisterParameter(ushort tag) method for registering custom TLV parameter type for any tag value.
It helps to represent some complex parameters as structured objects. Example: var parameter = pdu.Parameters.Of();
- MessageText property in PDU classes is obsolete. Use the function client.EncodingMapper.GetMessageText(pdu) or pdu.GetMessageText(client.EncodingMapper) to get th message text contained in the PDU.
[2.6.3] - 2019-03-04
- failed to raise some events with attached delegate that doesn't has target object.
- FileLogger multi-threading improvements.
[2.6.2] - 2019-02-07
- ILogFactory interface with implementations for File and Console
- client hangs by Dispose when it was never connected
[2.6.1] - 2019-02-04
- Cannot send 160 characters in one part SMS in GSM Encoding
[2.6.0] - 2019-01-14
- ProxyProtocolEnabled property for SmppServerClient class. This property should be enabled in evClientConnected event handler to detect proxy protocol in the network stream of connected client.
- Signed with Strong Name
- ClonePDU, Serialize methods for SmppPDU classes.
- SMS.ForData method for building concatenated DataSm PDUs.
- SMS.ForDeliver is able to create delivery receipt in MessagePayload parameter.
- SmppServer stops accepting new connections by invalid handshake
- Text splitter for building concatenated message parts
- Event evClientDataSm didn't raise in the SmppServer.
- Sometimes SmppServerClient doesn't disconnect properly in SmppServer
- concurrency issues in MessageComposer
- library sends response with status ESME_ROK when SmppServer has no attached event handler for a request PDU. It should send unsuccess status f.i. ESME_RINVCMDID.
- Replaced methods AddMessagePayload, AddSARReferenceNumber, AddSARSequenceNumber, AddSARTotalSegments and AddMoreMessagesToSend with corresponding classes in Inetlab.SMPP.Parameters namespace.
- Renamed the property "Optional" to "Parameters" in PDU classes. (backwards-compatible)
- Removed unnecessary TLV constructor with length parameter. Length is always equal to value array length.
- Removed ISmppMessage interface
- Renamed namespace Inetlab.SMPP.Common.Headers to Inetlab.SMPP.Headers
- Rename propery UserDataPdu to UserData for classes SubmitSm, SubmitMulti DeliverSm, ReplaceSm. (backwards-compatible)
- MessageInPayload method tells SMS builder to send complete message text in message_payload parameter. With optional messageSize method parameter you can decrease the size of message segment if you need to send concatenation in SAR parameters.
- Simplified ILog interface
[2.5.4] - 2018-09-16
- MessageComposer.Timeout property to TimeStamp
- SmppClient.Submit methods with IEnumerable parameter
- better documentation
- Hanlde SocketException OperationAborted when server stops
[2.5.3] - 2018-09-08
- SubmitSpeedLimit is ignored
- sometimes SMPP PDU reading is failed
[2.5.2] - 2018-08-06
- Messages with data coding Class0 (0xF0) are split up in wrong way
[2.5.1] - 2018-07-30
- wrong BindingMode for SmppServerClient after Unbind.
[2.5.0] - 2018-07-29
[2.4.1] - 2018-06-19
- issue with licensing module
[2.4.0] - 2018-05-30
- Automatic connection recovery.
[2.3.2] - 2018-04-20
- MessageComposer allows to get its items for concatenated messages.
- creation for user data headers types.
[2.3.1] - 2018-04-18
- PDU reader and writer
- split text on concatenation parts
[2.3.0] - 2018-03-18
- SmppClientBase.SendQueueLimit limits the number of sending SMPP messages to remote side. Delays further SMPP requests when limit is exceeded.
- SmppServerClient.ReceiveQueueLimit replaced with SmppClientBase.ReceivedRequestQueueLimit
- improved: processing of connect and disconnect.
[2.2.0] - 2018-02-01
- better processing of request and response PDU
- Flow Control. SmppServerClient.ReceiveQueueLimit defines allowed number of SMPP requests in receive queue.
If receive queueu is full, library stops receive from network buffer and waits until queue has a place again.
It is better alternative for ESME_RMSGQFUL response status.
- MessageComposer raises evFullMessageReceived sometimes two times by processing concatenated message with two parts.
[2.1.2] - 2017-12-11
- internal queue for processing PDU.
[2.1.1] - 2017-12-10
- processing of connect and disconnect
- From and To methods with SmeAddress parameter to SMS Builders
[2.1.0] - 2017-10-18
- SendSpeedLimit property for SmppClientBase class, that limits number of requests per second to remote side
- Priority processing for response PDUs.
- Name property to distinguish instances in logger
- Deliver method in SmmpServerClient class
- SubmitData method in SmppClientBase class
[2.0.1] - 2017-10-06
- decode receipt for IntermediateDeliveryNotification
- sequence number generation
[2.0.0] - 2017-08-15
- first version for .NET Standard 1.4