Coder Social home page Coder Social logo

ksmppd's Introduction

No longer maintained by Kurt. Donald Jackson has taken over.

KSMPPD aka Kurt's SMPP Daemon

This is my attempt at an alternative to OpenSMPPBox and the Commercial SMPPBox available

I would recommend reading this page in its entiriety and then moving on to the wiki for more details.

What I have tried to do here is implement an SMPP server which connects to the bearerbox as currently SMSBox with the following features:

  • ✅ Not bound by threads per client (built with libevent)
  • ✅ Fast start up and regardless of workload/queues
  • ✅ Limited memory usage (disk based excess queue storage)
  • ✅ Database authentication support
  • ✅ Database routing support
  • ✅ HTTP based authentication support
  • ✅ HTTP based routing support
  • ✅ Prepaid billing support
  • ✅ Multiple bearerbox connections
  • ✅ Throttling support
  • ✅ Full support for simulation (delivery reports, MO, failures)
  • ✅ Fully asynchronous
  • ✅ submit_sm_resp PDU's only provided once bearerbox or database has accepted storage
  • ✅ HTTP routers use a callback mechanism

TO-DO

  • Embeddable code (almost, just some thread joins to deal with)
  • others proposed via issue tracker

This software will be free, forever. If you get charged for this software, please notify me.

Acknowledgements

This product includes software developed by the Kannel Group (http://www.kannel.org/).

I'd also like to specifically thank the developer of OpenSMPPBox Rene Kluwen as I used some of his PDU conversion mechanisms in OpenSMPPBox.

It makes extensive use of gwlib and other features developed for Kannel, it would not be possible without them.

Special thanks to donald-jackson for multiple contributions.

If you do wish to donate to this project, please do so via the bitcoin address below.

BTC address: 1NhLkTDiZtFTJMefvjQY4pUWM3jD641jWN

Building

Thanks to rajesh6115 this build can now be completed using autotools.

Dependencies

Kannel

You need to have kannel installed with MySQL support in order to compile successfully. If you don't have kannel installed, you can do so by executing the following commands.

svn co https://svn.kannel.org/gateway/trunk kannel-trunk
cd kannel-trunk
./bootstrap.sh
./configure --with-mysql --enable-ssl --enable-start-stop-daemon --enable-static
make
sudo make install

Assuming the above is done successfully (you may need to install MySQL, libxml2, etc dependencies to successfully build).

Other dependencies

libevent

yum install -y libevent-devel

Building KSMPPD

Now that you have the dependencies ready you can do the following.

git clone https://github.com/kneodev/ksmppd.git
cd ksmppd
./bootstrap.sh

If the above goes well (you will only need to bootstrap once)

make

You can now run using ./smpp/ksmppd.

Using KSMPPD

I have created a number of example configurations in this repository located under examples/configurations

  • database-only is a system that requires no HTTP server and uses a database for authentication and routing
  • http-auth-database-routing uses an HTTP request to authenticate ESME's and a database for routing
  • http-only uses HTTP for both authentication and routing.

If using a database in any of the above examples, you will need to create the table schemas at a minimum located under database-schemas in this repository.

There are commands available via the built in HTTP server which allow you to perform certain tasks. Appending ".xml" to commands will produce output in XML format.

http://ksmppdhost:port/esme-status

curl "http://localhost:14010/esme-status?password=ksmppdpass"
Summary: 

Unique known ESME's: 3
Total inbound processed:0 load: 0.00/0.00/0.00/sec
Total outbound processed:0 load: 0.00/0.00/0.00/sec

smppusera - binds:4/0, total inbound load:(0.00/0.00/0.00)/11.00/sec, outbound load:(0.00/0.00/0.00)/sec
-- id:4 uptime:0d 0h 0m 11s, type:2, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1
-- id:3 uptime:0d 0h 0m 11s, type:2, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1
-- id:9 uptime:0d 0h 0m 10s, type:1, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1
-- id:8 uptime:0d 0h 0m 10s, type:1, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1

smppuserb - binds:2/2, total inbound load:(0.00/0.00/0.00)/0.00/sec, outbound load:(0.00/0.00/0.00)/sec
-- id:0 uptime:0d 0h 0m 13s, type:1, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1
-- id:1 uptime:0d 0h 0m 12s, type:2, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1

smppuserc - binds:2/0, total inbound load:(0.00/0.00/0.00)/0.00/sec, outbound load:(0.00/0.00/0.00)/sec
-- id:2 uptime:0d 0h 0m 11s, type:2, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1
-- id:5 uptime:0d 0h 0m 11s, type:1, open-acks:0, inbound (load/queued/processed/routing):0.00/0/1/0, outbound (load/queued/processed):0.00/0/1

http://ksmppdhost:port/esme-unbind

curl "http://localhost:14010/esme-unbind?password=ksmppdpass&system-id=smppuserb&bind-id=1"
1 binds disconnected
curl "http://localhost:14010/esme-unbind?password=ksmppdpass&system-id=smppuserb"
2 binds disconnected   

http://ksmppd:port/rebuild-routes (you MUST run this if you change routes in the database)

curl "http://localhost:14010/rebuild-routes?password=ksmppdpass
Routes updated

Performance

Benchmarks on a Core i5 @ 3.2 GHz this software processes 1534 messages per second (more thorough benchmarks later).

KSMPPD has been thoroughly tested for memory leaks in all scenarios and all have been dealt with that have been found.

Contributing

Please create issues or pull requests here to contribute.

Behaviour

At this stage I have determined optimal configuration to be with a database queue enabled. This enables better handling of failure in cases where ESME's are offline or bearerbox is unavailable.

All scenarios will allow ESME's to authenticate as normal, unless the database is down.

Some scenarios

There are no bearerbox connections alive for deliver of messages.

  • submit_sm (message submissions) will be queued to the database for later delivery and successful responses returned.
  • Any queued MO/DLR's from a previously alive bearerbox will be forwarded to connected ESME's.

At least one bearerbox is alive but no ESME's (or some receivers) are not available

  • MO/DLR's received from bearerbox will be attempt to be routed to a target receiver ESME - if not available they will be queued to try later.
  • Once a previously unavailable ESME becomes available, pending MO/DLR's will be forwarded.
  • It's important to note that there is an 'open ack' limit to ESME's, and if an ESME hits this limit, messages will begin being queued to the database.

System is behaving as normal (database up, bearerbox(s) up, ESME's available)

  • If a bearerbox rejects a message (invalid routing, etc) - the ESME will get this result immediately via submit_sm_resp
  • If permanent routing failure for MO (eg: no routes) messages will be discarded and bearerbox notified accordingly (ack_failed)
  • If an ESME exceeds their max allowed open acks, messages will be queued to the database and requeued as space becomes available. This is to solve excessive memory use.

System restart

  • The system first starts, connects to bearerbox and allows connections from ESMEs. Once started it begins reprocessing bearerbox queues if any.
  • Once ESME's reconnect - their queued messages (in database) will begin being reprocessed.

ksmppd's People

Contributors

donald-jackson avatar itskenny0 avatar kneodev avatar rajesh6115 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ksmppd's Issues

source_regex inquiries

Hello Kurt,
I have some issues with source regex for special sender:

  • Brandname sender which contains under square '_' character, e.g ^(GOOGLE_NOW)$ is not work
  • ^(123\d\d)$ is not work, such as want to limit sender from 12300 to 12399.
    And if source regex is not matched, ksmppd box responds "0x0000000b/Invalid Destination Address", it should be "Invalid Source Address", isn't it?

Many thanks.
Lamnt.
.

not able to track long messages with a common ID to update DLR

Hi Neo,
we are not able to track or update the DLR for the below-given scenario,

ESME user submit's 300 character message which is two part messages,
we are able to receive it via ksmppd and update it to our DB like,
eg values: message ID 1000 with part 1 message this is row1,
message id 1001 with part 2 message and this is row2 in DB Note there is no similarity is message id given by smpp as well, so they are considered as two different messages.
and process them to the end Destined SMSC,

The Problem,

While the SMSC is taking this that is reaching operator and delivery happened.
while end vendor replies back with 1 DLR report with 1st part msg id with DLR response,
and we are updating part1 msg with Delivered,

while the part2 doesn't get delivery reports from the vendor as this is one long message.

Request you to make me understand how to sort this scenario as am confused how to solve this matter.

Thanks.

Additional feature for outbound message routing

From comments in sample routing tables, i understand that Kneo intents to route defined origination short codes (such as ^(1800)) to respective smsc_id submitted by each system_id. But in fact, the regex is applied for destination numbers. Seem Kneo treats this exactly similar to inbound message (MO) concept.
Since in actual use cases for outbound msg, we need rule for origination number rather than destination number. Thanks.

Throttling error for long SMS

When submit only a long SMS (>160 characters) to KSMPPD, got the throttling error in ksmppd log as below. The 1st sms segment is delivered to smsc and the remains are queued then sent later one by one:
2016-08-20 17:31:03 [1646] [11] ERROR: SMPP[test] Exceeded throughput 45.189450, 11.000000, throttling.
2016-08-20 17:31:03 [1646] [16] DEBUG: SMPP[test:0] Got outbound queued PDU (1) seq 0:

Make max-open-acks configurable

As per commit d294587 please make open acks configurable to avoid large bearerbox queues under conditions where load is high and clients process DLR/MO's slowly.

concatenated MTSMS support

Greetings!

Does ksmppd supports concat MTSMS? Tested few times but it doesn't seemed like, though the UDH parameters received properly.
Thanks and let me know if you need logs.

Garz

DND Filtration

Hi,

Is it possible to filter dnd numbers send by the smpp users.?

Speed Issue

Hi,

i have install ksmppd on E-1245 v5 32Gb ram dedicated server also i have allow 250 TPS to my client but still my client receive on 20-30 tps can anyone help me to optimise speed for ksmppd

thanks

How to use Routes

Hi,

i have installed ksmppd and its works fine but am unable to use database based routing i mean ( if i set default_smsc in user table so it's don't match routing rules and if i keep this filed blank or null is reply "NACK%2F0x0000000b%2FInvalid+Destination+Address")

kindly suggest how i can use routing also how i can change bind mode for an user (TX, RX or TRX)

Thanks

Having a problem with clients that often disconnect, ksmppd crash

Hi,

I'm having a problem with two ESME clients that exhaust their bind limits. I suspect that they are unbinding after a single or a batch of messages.
But, what I notice in the tcpdump is that ksmppd does not always respond to the unbind request or bind transceiver (Please filter the attached tcpdump either by smpp.command_id == 0x80000006||smpp.command_id == 0x00000006 or smpp&&ip.addr==193.27.2.30.

Testing with a single client, I do get immediate unbind response, but it takes roughly 20 seconds until the TCP connection is released.

What I notice with client mobilethink in the logs is the following:

2017-04-12 00:17:21 [7040] [15] ERROR: SMPP[mobilethink] Client no longer connected!
2017-04-12 00:17:55 [7040] [0] ERROR: Could not read PDU from (null) status was -1
2017-04-12 00:18:05 [7040] [11] WARNING: SMPP[mobilethink] has exceeded its bind limit (2/2), rejecting

With 12 clients and this issue I had ksmppd crash last Sunday with PANIC (log exceprt below).

2017-04-09 05:41:25 [2660] [10] WARNING: SMPP[mobilethink] has exceeded its bind limit (2/2), rejecting
2017-04-09 05:41:44 [2660] [14] ERROR: SMPP: Optional field (receipted_message_id) with invalid length (36) (should be 9) dropped.
...previous message repeats 10 times
2017-04-09 05:41:44 [2660] [0] PANIC: /vas/bin/ksmppd() [0x45bd28]
2017-04-09 05:41:44 [2660] [0] PANIC: /lib/x86_64-linux-gnu/libpthread.so.0(+0x11390) [0x7f9a1fc67390]
2017-04-09 05:41:44 [2660] [0] PANIC: /vas/bin/ksmppd(smpp_listener_event+0x17) [0x40f86b]
2017-04-09 05:41:44 [2660] [0] PANIC: /vas/bin/ksmppd(event_base_loop+0x7b1) [0x482b41]
2017-04-09 05:41:44 [2660] [0] PANIC: /vas/bin/ksmppd(smpp_listener_start+0x128) [0x410114]
2017-04-09 05:41:44 [2660] [0] PANIC: /vas/bin/ksmppd(main+0x204) [0x40f803]
2017-04-09 05:41:44 [2660] [0] PANIC: /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f9a1f0e6830]
2017-04-09 05:41:44 [2660] [0] PANIC: /vas/bin/ksmppd(_start+0x29) [0x40f449]

Version info:
Kannel ksmppd version svn-r5173M'. Build Feb 14 2017 10:49:11', compiler `5.4.0 20160609'.
System Linux, release 4.4.0-66-generic, version #87-Ubuntu SMP Fri Mar 3 15:29:05 UTC 2017, machine x86_64.
Hostname smpp-proxy, IP 127.0.1.1.
Libxml version 2.9.3.
Compiled with MySQL 5.7.17, using MySQL 5.7.17.
Using native malloc.

custom dlr

Hi neo,
kindly help me tried all way around.
when datasubmit is coming to http page i have placed the
Header('X-KSMPPD-Route-Error-Code: 54');

but still getting error:NACK/0X00000036/UNKNOWN/RESERVED

======

and one more query explaining an assumption:

esme client connected to the smpp server and we have again connected to an operator account.

a message submitted by esme user goes to operator and operator gives back dlr resp sometimes with txt ref and some custom data basically varies from operator to operator.

while at our smppserver how to customise those values dynamically or via a db storage.

this is a big problem in the smppserver as you are forced to send responses sent by operators and everytime you change your operator to another the error reasons and mapping changes again.
where we wanted to maintain static error codes so esme user need not to worry of updating error codes every time operator changes in use cases.

Issues in Aug 2016

Dear,

  1. Restrict certain source IPs to bind in with an ESME account.
  2. Restrict specific shortcodes/brandnames for sender/origination that ESME allowed to submit.
  3. In the approach: bearerbox <--> sqlbox <--> ksmppd, the "time" field in sent_sms table is NULL for the MT message, while MO or DLR are still ok.

Thank you.

SMPP password length issue

Seem kannel only support SMPP password up to 8 characters. In case of creating an SMPP account for clientA on KSMPPD box which have password's length > 8 characters, kannel automatically truncate the password into 8 while submit the bind to KSMPPD but there is no response at all from KSMPPD.

Here is ksmppd log:
2017-05-28 22:32:27 [15284] [4] WARNING: SMPP[clientA] Has no receivers connected, queuing in database

Double SMS

Hi,

When my smpp users sent messages sometimes i get double entry at the smpp server. What will be the reason?

error

Hi,

i have install and configure ksmppd and it's work perfectly all sms deliver and reports everything works fine

but in ksmppd logs i can see 1 error which i receive continuously

[15] ERROR: SMPP: Unknown TLV `dlr_err', don't send.

can anyone help me to resolve this error

thanks

IP white listing and Default SMSC_ID

Hi,

There is a field named connect_allow_ip in smpp_user table . Is that field for white listing the ip of smpp user?

Also there is default_smsc field in smpp_user table. But messages are going via another smsc id when the service of default_smsc is dead. How can we prevent messages going via another smsc id other than default smsc.

How to use fake sms with ksmppd and how to have mode tutorial

Hello,

I succeeded installing ksmppd and kannel, and would like to know if it is possible to use the tool fakesms of kannel to make test on my platform ?

By the way, is it possible to have moe tutorial ? how to contibute ?

thanks in advance for your support

PANIC initializing mysql configuration group id

Everything was working just fine when all of a sudden the following error started popping up upon restart

Error configuring database mysqld configuration ksmppd

Although the same id is used in GROUP KSMPPD and GROUP mysql-connection

Message_id too long for SMPP 3.3 clients

Hi,
This issue is related to issue #49 but the source of the problem deserves separate issue id.
Namely, #49 describes a problem related to two clients that were disconnecting all the time.
I isolated one of the clients that is disconnecting after each and every message on opensmppbox and the problem was not evident. A short comparison of the tcpdumps below reveals that opensmppd sends shorter message_id in the submit_sm_response PDU, while ksmppd is using very long message ids:
https://www.dropbox.com/s/nqfwx14by3e121r/smpp33_on_ksmppd.pcap?dl=0
https://www.dropbox.com/s/p8yxew5atmekkc8/smpp33_on_opensmppbox.pcap?dl=0
Differences in SMPP 3.3 and SMPP 3.4 standards mention that in SMPP3.3 message_id ia null terminated C-octet (HEX) stream with up to 8 characters (plus the null), while in SMPP3.4 this was 9, 33 and then 63 characters.
The ESME is sending 0x00, which according to the standard (page 46) indicates properly version 3.3 or earlier.

BINF

Hi,

When the smpp users send the messages the BINF field is coming blank. So I cant calculate the credits used by them for sending that particular message. How can we insert the BINF field for each message?

ksmppd crashed in simulation mode

its crashed when 3 TRX bind with Delivery 2 and Failed permanent 3

2016-10-13 13:25:06 [12913] [8] PANIC: ksmppd() [0x48178c]
2016-10-13 13:25:06 [12913] [8] PANIC: /lib64/libpthread.so.0(+0xf7e0) [0x7f8ae55547e0]
2016-10-13 13:25:06 [12913] [8] PANIC: ksmppd(smpp_queues_callback_deliver_sm_resp+0x78) [0x412738]
2016-10-13 13:25:06 [12913] [8] PANIC: ksmppd(smpp_queues_simulation_thread+0x172) [0x412ed0]
2016-10-13 13:25:06 [12913] [8] PANIC: ksmppd() [0x46aa29]
2016-10-13 13:25:06 [12913] [8] PANIC: /lib64/libpthread.so.0(+0x7aa1) [0x7f8ae554caa1]
2016-10-13 13:25:06 [12913] [8] PANIC: /lib64/libc.so.6(clone+0x6d) [0x7f8ae42ef93d]

incorrect credit deduction while sending unicode

But when i send single (41 char) unicode sms ksmppd deducts two credits for unicode it 70+67 and i connected ksmppd to sqlbox and in that it sends two sms please check this issue may ksmppd is counting the encoded unicode sms length.

issue with long sms

Hi,

i have configure ksmppd with kannel and sqlbox all functions works fine but i have little issue with long sms dlr incase of long sms(more then 160 char) i receive first sms dlr and once my provided send second sms dlr it's showing error in logs

got DLR but could not find message or was not interested in it id dst<9876543210>, type<1>

am using smpp for as smsc

please anyone help me to resolve this issue

issue with dlr-mask

Hi,

as per my last question i have issue with long sms please check few points which i notice

i think issue with ksmppd because it's send dlr-mask 0 with every extra part of long sms if it's send dlr-mask 19 for every part i surely receive dlr for every part

can you please help me to configure ksmppd to send dlr mask 19 for every message part

thanks

block Particular number

Hi,

Is it possible to block message to a particular number ? If so how can I do that? Please help me..

custom dlr

when decision of rejecting the message at http api - smpp-route.php

we are able to reject only with 45 error nack (SUBMIT FAILED)

how to Reject with Custom errors on http api without passing to smsc.

Error converting from GSM to Unicode

Hi,

I come across the following or similar entries in the ksmppd log:
2017-04-12 19:13:05 [28754] [9] WARNING: Could not convert GSM (0xfc) to Unicode.

It is u with umlaut character (ü) (Latin-1/ISO-8859-1 maybe) and it's hex code is clearly outside of the GSM alphabet. It implies client is not using 7-bit GSM.
I expect that ksmppd must convert everything to utf-8 before passing to bearerbox, but question is when DCS=0, ksmppd doesn't know which default alphabet the client is using. Most frequently it is one of ISO-8859-1, ASCII or GSM.
What is the conversion policy of ksmppd? Will it reject the entire SMS or replace the sign with "?".
Please consider adding default alphabet setting for the client so that the conversion to utf-8 is proper.

Davor

output after run

hello,
im running kannel 1.5.0, centos 6 64bits, from a rpm
i am getting lots of output after running the ksmppd like this:
it is okay ??

2016-09-20 13:51:44 [17459] [0] DEBUG: ---------------------------------------------- 2016-09-20 13:51:44 [17459] [0] DEBUG: KSMPPD kmppd version 0.6 starting 2016-09-20 13:51:44 [17459] [0] INFO: Starting SMPP server on port 2345 2016-09-20 13:51:44 [17459] [0] INFO: Successfully configured bearerbox localhost:14001 KSMPPD 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 4 (smpp/libsmpp/smpp_bearerbox.c:smpp_bearerbox_inbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 5 (smpp/libsmpp/smpp_bearerbox.c:smpp_bearerbox_outbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 6 (smpp/libsmpp/smpp_bearerbox.c:smpp_bearerbox_requeue_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 7 (smpp/libsmpp/smpp_esme.c:smpp_esme_cleanup_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Initializing SMPP Server queues 2016-09-20 13:51:44 [17459] [0] INFO: Starting simulation queue threads 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 8 (smpp/libsmpp/smpp_queues.c:smpp_queues_simulation_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Staring 4 inbound queue threads 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 9 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 10 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 11 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 12 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Staring 4 outbound queue threads 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 13 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 14 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 15 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 16 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) 2016-09-20 13:51:44 [17459] [0] DEBUG: Started thread 17 (smpp/libsmpp/smpp_queues.c:smpp_queues_requeue_thread) 2016-09-20 13:51:44 [17459] [12] DEBUG: Thread 12 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [12] DEBUG: Starting inbound PDU processor thread 2016-09-20 13:51:44 [17459] [13] DEBUG: Thread 13 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [13] DEBUG: Starting outbound PDU processor thread 2016-09-20 13:51:44 [17459] [14] DEBUG: Thread 14 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [14] DEBUG: Starting outbound PDU processor thread 2016-09-20 13:51:44 [17459] [15] DEBUG: Thread 15 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [15] DEBUG: Starting outbound PDU processor thread 2016-09-20 13:51:44 [17459] [17] DEBUG: Thread 17 (smpp/libsmpp/smpp_queues.c:smpp_queues_requeue_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [17] DEBUG: Starting deliver_sm (and other?) requeue thread 2016-09-20 13:51:44 [17459] [4] DEBUG: Thread 4 (smpp/libsmpp/smpp_bearerbox.c:smpp_bearerbox_inbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [4] DEBUG: Bearerbox connection is dead, (re)connecting it localhost:14001 KSMPPD 2016-09-20 13:51:44 [17459] [4] DEBUG: Connecting to <127.0.0.1> 2016-09-20 13:51:44 [17459] [5] DEBUG: Thread 5 (smpp/libsmpp/smpp_bearerbox.c:smpp_bearerbox_outbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [9] DEBUG: Thread 9 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [9] DEBUG: Starting inbound PDU processor thread 2016-09-20 13:51:44 [17459] [6] DEBUG: Thread 6 (smpp/libsmpp/smpp_bearerbox.c:smpp_bearerbox_requeue_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [6] INFO: Starting bearerbox requeue thread 2016-09-20 13:51:44 [17459] [7] DEBUG: Thread 7 (smpp/libsmpp/smpp_esme.c:smpp_esme_cleanup_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [7] DEBUG: ESME cleanup thread starting 2016-09-20 13:51:44 [17459] [7] INFO: Current SMPP load is 0.000000/sec inbound 0.000000/sec outbound 2016-09-20 13:51:44 [17459] [8] DEBUG: Thread 8 (smpp/libsmpp/smpp_queues.c:smpp_queues_simulation_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [8] DEBUG: Starting simulation processor thread 2016-09-20 13:51:44 [17459] [10] DEBUG: Thread 10 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [10] DEBUG: Starting inbound PDU processor thread 2016-09-20 13:51:44 [17459] [11] DEBUG: Thread 11 (smpp/libsmpp/smpp_queues.c:smpp_queues_inbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [11] DEBUG: Starting inbound PDU processor thread 2016-09-20 13:51:44 [17459] [16] DEBUG: Thread 16 (smpp/libsmpp/smpp_queues.c:smpp_queues_outbound_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [16] DEBUG: Starting outbound PDU processor thread 2016-09-20 13:51:44 [17459] [4] INFO: Connected to bearerbox at localhost port 14001. 2016-09-20 13:51:44 [17459] [4] INFO: Successfully connected and identified. 2016-09-20 13:51:44 [17459] [6] DEBUG: column=global_id buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=sender buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=receiver buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=udhdata buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=msgdata buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=time buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=smsc_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=smsc_number buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=foreign_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=service buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=account buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=id buffer_type=253 max_length=0 length=128 2016-09-20 13:51:44 [17459] [6] DEBUG: column=sms_type buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=mclass buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=mwi buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=coding buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=compress buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=validity buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=deferred buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=dlr_mask buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=dlr_url buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=pid buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=alt_dcs buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=rpi buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=charset buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=boxc_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=binfo buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=msg_left buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=priority buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=resend_try buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=resend_time buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=meta_data buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [3] DEBUG: Thread 3 (smpp/libsmpp/smpp_http_server.c:smpp_http_server_request_handler) maps to pid 17459. 2016-09-20 13:51:44 [17459] [3] INFO: Starting HTTP Server thread on port 14010 2016-09-20 13:51:44 [17459] [2] DEBUG: Thread 2 (gwlib/http.c:server_thread) maps to pid 17459. 2016-09-20 13:51:44 [17459] [2] DEBUG: HTTP: Including port 14010, fd 14 for polling in server thread 2016-09-20 13:51:44 [17459] [6] DEBUG: column=global_id buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=sender buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=receiver buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=udhdata buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=msgdata buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=time buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=smsc_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=smsc_number buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=foreign_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=service buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=account buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=id buffer_type=253 max_length=0 length=128 2016-09-20 13:51:44 [17459] [6] DEBUG: column=sms_type buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=mclass buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=mwi buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=coding buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=compress buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=validity buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=deferred buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=dlr_mask buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=dlr_url buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=pid buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=alt_dcs buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=rpi buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=charset buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=boxc_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=binfo buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [6] DEBUG: column=msg_left buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=priority buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=resend_try buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=resend_time buffer_type=8 max_length=0 length=20 2016-09-20 13:51:44 [17459] [6] DEBUG: column=meta_data buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:44 [17459] [1] DEBUG: Thread 1 (gwlib/fdset.c:poller) maps to pid 17459. 2016-09-20 13:51:45 [17459] [6] DEBUG: column=global_id buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=sender buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=receiver buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=udhdata buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=msgdata buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=time buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=smsc_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=smsc_number buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=foreign_id buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=service buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=account buffer_type=252 max_length=0 length=65535 2016-09-20 13:51:45 [17459] [6] DEBUG: column=id buffer_type=253 max_length=0 length=128 2016-09-20 13:51:45 [17459] [6] DEBUG: column=sms_type buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=mclass buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=mwi buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=coding buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=compress buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=validity buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=deferred buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=dlr_mask buffer_type=8 max_length=0 length=20 2016-09-20 13:51:45 [17459] [6] DEBUG: column=dlr_url buffer_type=252 max_length=0 length=65535

SQLBOX integration

hello, i will like to know if i can integrate or make the accounts to send sms to the SQLBOX, or make the KSMPPD to store sent sms ??

how to connect ksmppd with sqlbox

hi,

how to connect ksmppd with sqlbox or how to manage reports over smpp please guide am unable to find anything in readme file regarding this

thanks

Not possible to route inbound (direction 2) on smsc_id only

Hi,
I'm having a problem routing inbound (MO->AT) SMS using the DB method (smpp_route) using only smsc_id as a parameter and setting .* (or even null) for destination addresses. ksmppd will always match the first record having regex .* and direction 2, i.e. smsc_id is not taken into account.
Please elaborate the matching algorithm and the fields it considers.

ksmppdbox is hung

Hi Kurt,
I'd put ksmppbox in a litter bit high/real traffic, it works fine until in a randomly moment (a half of day or few days), it's process occupied 100% usage on a just only 1 core of CPU and all clients disconnected.

Since we have box status output each 30 seconds of interval, here is some logs:

  1. Something seem start to when wrong from this time, then i observed no outbound anymore but inbound still be routed successfully:

2016-12-18 11:02:33 [31771] [7] DEBUG: 2 ESME's queued for cleanup
2016-12-18 11:02:33 [31771] [7] DEBUG: SMPP[(null)] destroying expired bind id 6307
2016-12-18 11:02:33 [31771] [7] DEBUG: Destroying ESME id:6307 - (null)
2016-12-18 11:02:33 [31771] [7] DEBUG: SMPP[(null)] can't destroy because time has not elapsed (11) id 6308

2. Next 30 seconds, it was become worser:

2016-12-18 11:03:03 [31771] [7] DEBUG: 6 ESME's queued for cleanup
2016-12-18 11:03:03 [31771] [7] DEBUG: SMPP[(null)] destroying expired bind id 6308
2016-12-18 11:03:03 [31771] [7] DEBUG: Destroying ESME id:6308 - (null)
2016-12-18 11:03:03 [31771] [7] DEBUG: SMPP[(null)] destroying expired bind id 6309
2016-12-18 11:03:03 [31771] [7] DEBUG: Destroying ESME id:6309 - (null)
2016-12-18 11:03:03 [31771] [7] DEBUG: SMPP[(null)] destroying expired bind id 6310
2016-12-18 11:03:03 [31771] [7] DEBUG: Destroying ESME id:6310 - (null)
2016-12-18 11:03:03 [31771] [7] DEBUG: SMPP[(null)] can't destroy because time has not elapsed (10) id 6311
2016-12-18 11:03:03 [31771] [7] DEBUG: SMPP[smppclientB] can't destroy because time has not elapsed (5) id 6306
2016-12-18 11:03:03 [31771] [7] DEBUG: SMPP[smppclientC] can't destroy because time has not elapsed (15) id 6197

3. And next 30 seconds, inbound has no route and go to queue due to all clients supposed to disconnected:

2016-12-18 11:03:33 [31771] [7] DEBUG: 3 ESME's queued for cleanup
2016-12-18 11:03:33 [31771] [7] DEBUG: SMPP[(null)] destroying expired bind id 6311
2016-12-18 11:03:33 [31771] [7] DEBUG: Destroying ESME id:6311 - (null)
2016-12-18 11:03:33 [31771] [7] DEBUG: SMPP[smppclientB] destroying expired bind id 6306
2016-12-18 11:03:33 [31771] [7] DEBUG: Destroying ESME id:6306 - smppclientB
2016-12-18 11:03:33 [31771] [7] DEBUG: SMPP[smppclientC] destroying expired bind id 6197
2016-12-18 11:03:33 [31771] [7] DEBUG: Destroying ESME id:6197 - smppclientC

2016-12-18 11:03:52 [31771] [14] ERROR: Error writing 683 octets to fd 57:
2016-12-18 11:03:52 [31771] [14] ERROR: System error 32: Broken pipe

2016-12-18 11:04:30 [31771] [4] DEBUG: SMPP[smppclientA] Outbound queue is full 20
2016-12-18 11:04:30 [31771] [4] WARNING: SMPP[smppclientA] Has no receivers connected, queuing in database
2016-12-18 11:04:30 [31771] [4] DEBUG: Queued response message for smppclientA to database
2016-12-18 11:04:30 [31771] [4] DEBUG: Acknowledging 57187fc3-9495-4fce-99b5-85f4070ebdb7 to bearerbox
2016-12-18 11:04:31 [31771] [17] DEBUG: ESME smppclientA has queued messages in store
2016-12-18 11:04:31 [31771] [17] DEBUG: SMPP[smppclientA] has queued messages but no receivers available
2016-12-18 11:04:31 [31771] [17] DEBUG: Load was 0.000000 for requeue (not busy), waiting before next check

2016-12-18 11:05:04 [31771] [7] WARNING: SMPP[smppclientD] Queued ack 497 has expired (diff 121)
2016-12-18 11:05:04 [31771] [7] DEBUG: SMPP[smppclientD] Got deliver_sm callback status 1024 0x7f9784353280
2016-12-18 11:05:04 [31771] [7] DEBUG: Acknowledging a8ba4eb4-81d6-49e4-a71f-cdc02ce1b075 to bearerbox
2016-12-18 11:05:04 [31771] [7] ERROR: SMPP[smppclientD] ESME has not ack'd message sequence 497, disconnecting

Please guide me if you need more log that may be useful for you. Thanks.

Lamnt.

Smpp user cant connect ...re-connecting

Hi.
I have created an SMPP user vith ksmppd. But when i try to connect it it is showing re-connect. My ksmppd log file is given below:

2017-02-16 12:00:11 [24376] [14] DEBUG: SMPP[(null):9] Got outbound queued PDU (1) seq 0:
2017-02-16 12:00:11 [24376] [14] DEBUG: SMPP[(null)] Sending bind_transceiver_resp:
2017-02-16 12:00:11 [24376] [14] DEBUG: SMPP PDU 0x7f5c5c000e50 dump:
2017-02-16 12:00:11 [24376] [14] DEBUG: type_name: bind_transceiver_resp
2017-02-16 12:00:11 [24376] [14] DEBUG: command_id: 2147483657 = 0x80000009
2017-02-16 12:00:11 [24376] [14] DEBUG: command_status: 13 = 0x0000000d
2017-02-16 12:00:11 [24376] [14] DEBUG: sequence_number: 5 = 0x00000005
2017-02-16 12:00:11 [24376] [14] DEBUG: system_id: NULL
2017-02-16 12:00:11 [24376] [14] DEBUG: SMPP PDU dump ends.
2017-02-16 12:00:11 [24376] [14] DEBUG: SMPP[(null)] Adding 9 to cleanup queue
2017-02-16 12:00:21 [24376] [0] DEBUG: Got connection from 188.40.43.78
2017-02-16 12:00:21 [24376] [0] DEBUG: IP address 188.x.x.x. is blocked for another 290 seconds
2017-02-16 12:00:21 [24376] [0] DEBUG: 188.x.x.x is temporarily banned from connecting. Rejecting.

Issue With installing Ksmppd

Hi,

i have tried to install ksmppd on centos_6_64x on vps server but during run command "./bootstrap.sh" i receive error below

/usr/bin/svn: error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file: No such file or directory
Fatal error occurred executing /usr/bin/svn checkout -r 5173 https://svn.kannel.org/gateway/trunk kannel-svn-trunk

please help

Thanks
Deepak

Long sms handling

Hi,

i'm testing kannel to kannel connection, my test configuration:

[playsms1 -> smsbox1 -> sqlbox1 -> kannel1] ---> [opensmppbox3 -> sqlbox3 -> kannel3] ---> [ksmppd2 -> sqlbox2 -> kannel2] ---> [SMSC]

I send long sms from playsms1, it is stored in sqlbox1 as one part (one record with dlr-mask 31).
Received by opensmppbox in sqlbox3, it is still stored as one part (one record with dlr-mask 19).
Received by ksmppd in sqlbox2, it is stored as three parts (three records one with dlr-mask 19 and two with 0).
Is it posible to configure ksmppd to concatenate sms as opensmppbox do ?.
Other question is it posible to change(set) default dlr-mask from 19 to 31 for sms received by ksmppd(or opensmppbox)?

Regards.

X-Ksmppd-Msgdata Unicode Data not correct

Hi neo,

iam testing the only http options.

where when i receive unicode messages the messages are coming in some encoded format which we are not able to decode.

Unicode Billing cant be possible without this data coming in.

DLR not available anywhere

Currently we have deployed KSMPPD with SQLBOX & Kannel 1.4.4
Everything seems to be working fine in testing phase and able to submit outbound messages from ESME >> KSMPPD >> SQLBOX >> KANNEL

However i have noticed that all dlr_mask values are set to 19 and also we have no idea how to track DLR or view the status?

Another note is keeping track of the original ESME Message ID Vs the SMSC or Kannel Msg ID

Suggestions for Server Status view

It would really good to show the source IP for each of the active binds. Also I think the figure for "processed" should be the number of processed messages and not processed PDUs for both inbound and outbound.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.