Table of Contents

SMPP Server FAQ

How to send message to connected client

In following code target client is selected and DeliverSm message is sent to this client.

SmppServerClient client = server.ConnectedClients[0];

client.Deliver(SMS.ForDeliver()
          .From(message.PhoneNumber)
          .To(message.ClientNumber)
          .Text(message.Text)
          );

In production environment client selection will be more smart than array index of ConnectedClients.

You can also use asynchronous method DeliverAsync(DeliverSm) and event evDeliverComplete which should be hooked up to the handler method when client bound with the server.

Example of how to send messages out from the server on a bind

Server.evClientBind += (sender, client, pdu) =>
   {
      if (ClientAllowed(client, pdu))
      {
          //Check if bound client can receive messages
          if (client.BindingMode == ConnectionMode.Transceiver || client.BindingMode == ConnectionMode.Receiver)
          {
              //Start messages delivery
              ThreadPool.QueueUserWorkItem(state => DeliverMessages(client, pdu));


              //Start sending delivery reciepts
              ThreadPool.QueueUserWorkItem(state => DeliverReceipts(client, pdu));
          }
      } else {
          pdu.Response.Status = CommandStatus.ESME_RBINDFAIL;
      }
   };
   

  private void DeliverMessages(SmppServerClient client, Bind pdu)
  {
      var messages = _query.GetMessagesForClient(pdu.SystemId, pdu.SystemType);
      foreach (var message in messages)
      {
          var pduBuilder = SMS.ForDeliver()
              .From(message.PhoneNumber)
              .To(message.ClientNumber)
              .Text(message.Text);

          foreach (var deliverPdu in pduBuilder.Create(client))
          {
              client.DeliverAsync(deliverPdu);
          }
      }
  }
   
 private void DeliverReceipts(SmppServerClient client, Bind pdu)
 {
     var messages = _query.GetDeliveryReceiptsForClient(pdu.SystemId, pdu.SystemType);

     foreach (var message in messages)
     {
         client.DeliverAsync(
                      SMS.ForDeliver()
                     .From(message.SourceAddr, message.SourceAddrTon, message.SourceAddrNpi)
                     .To(message.DestAddr, message.DestAddrTon, message.DestAddrNpi)
                     .Receipt(new Receipt
                              {
                                  DoneDate = DateTime.Now,
                                  State = MessageState.Delivered,
                                  MessageId = message.MessageId,
                                  ErrorCode = "0",
                                  SubmitDate = message.SubmitDate,
                                  Text = message.Text
                              })
                     );

    }
 }