fakesmsc.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:6k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * fakesmsc.c - simulate an SMS center, using a trivial protocol
  3.  *
  4.  * The protocol:
  5.  *
  6.  * Client sends each message on its own line (terminated with rn or n).
  7.  * The line begins with 3 space-separated fields:
  8.  * sender's phone number, receiver's phone number,
  9.  * type of message. Type of message can be one of "text", "data", or
  10.  * "udh". If type == "text", the rest of the line is taken as the message.
  11.  * If type == "data", the next field is taken to be the text of the
  12.  * message in urlcoded form. Space is coded as '+'. If type == "udh",
  13.  * the following 2 fields are taken to be the UDH and normal portions
  14.  * in urlcoded form. Space is again coded as '+'.
  15.  * The server sends replies back in the same format.
  16.  *
  17.  * Lars Wirzenius, later edition by Kalle Marjola
  18.  * Largely rewritten by Uoti Urpala
  19.  */
  20. static char usage[] = "n
  21. Usage: fakesmsc [-H host] [-p port] [-i interval] [-m max] <msg> ... n
  22. n
  23. * 'host' and 'port' define bearerbox connection (default localhost:10000),n
  24. * 'interval' is time in seconds (floats allowed) between generated messages,n
  25. * 'max' is the total number sent (-1, default, means unlimited),n
  26. * <msg> is message to send, if several are given, they are sent randomly.n
  27. n
  28. msg format: "sender receiver type(text/data/udh) [udhdata] msgdata"n
  29. n
  30. Type "text" means plaintext msgdata, "data" urlcoded, "udh" urlcoded udh+msgn
  31. n
  32. Examples: n
  33. n
  34. fakesmsc -m 1 "123 345 udh %04udh%3f message+data+here"n
  35. fakesmsc -i 0.01 -m 1000 "123 345 text nop" "1 2 text another message here"n
  36. n
  37. Server replies are shown in the same message format.n";
  38. #include <errno.h>
  39. #include <math.h>
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <time.h>
  44. #include <unistd.h>
  45. #include <sys/time.h>
  46. #include <limits.h>
  47. #include <signal.h>
  48. #include <sys/param.h>
  49. #include "gwlib/gwlib.h"
  50. static int port = 10000;
  51. static Octstr *host;
  52. static long max_send = LONG_MAX;
  53. static double interval = 1.0;
  54. static int sigint_received;
  55. static void signal_handler(int signum) {
  56.     if (signum == SIGINT)
  57. sigint_received = 1;
  58.     else
  59. panic(0, "Caught signal with no handler?!");
  60. }
  61. static void setup_signal_handlers(void) {
  62.     struct sigaction act;
  63.     act.sa_handler = signal_handler;
  64.     sigemptyset(&act.sa_mask);
  65.     act.sa_flags = 0;
  66.     sigaction(SIGINT, &act, NULL);
  67. }
  68. /* Choose a random message from a table of messages. */
  69. static Octstr *choose_message(Octstr **msgs, int num_msgs) {
  70.     /* the following doesn't give an even distribution, but who cares */
  71.     return msgs[gw_rand() % num_msgs];
  72. }
  73. /* Get current time, as double. */
  74. static double get_current_time(void) {
  75.     struct timezone tz;
  76.     struct timeval now;
  77.     gettimeofday(&now, &tz);
  78.     return (double) now.tv_sec + now.tv_usec / 1e6;
  79. }
  80. /* our arguments */
  81. static int check_args(int i, int argc, char **argv) {
  82.     if (strcmp(argv[i], "-p")==0 || strcmp(argv[i], "--port")==0)
  83.         port = atoi(argv[i+1]);
  84.     else if (!strcmp(argv[i], "-H") || !strcmp(argv[i], "--host"))
  85. host = octstr_create(argv[i+1]);
  86.     else if (strcmp(argv[i], "-m")==0 || strcmp(argv[i], "--messages")==0) {
  87. max_send = atoi(argv[i+1]);
  88. if (max_send < 0)
  89.     max_send = LONG_MAX;
  90.     }
  91.     else if (strcmp(argv[i], "-i")==0 || strcmp(argv[i], "--interval")==0)
  92. interval = atof(argv[i+1]);
  93.     else {
  94. panic(0, "%s", usage);
  95. return 0;
  96.     }
  97.     return 1;
  98. }
  99. /* The main program. */
  100. int main(int argc, char **argv) {
  101.     Connection *server;
  102.     Octstr *line;
  103.     Octstr **msgs;
  104.     int i;
  105.     int mptr, num_msgs;
  106.     long num_received, num_sent;
  107.     double first_received_at, last_received_at;
  108.     double first_sent_at, last_sent_at;
  109.     double start_time, end_time;
  110.     double delta;
  111.     gwlib_init();
  112.     setup_signal_handlers();
  113.     host = octstr_create("localhost");
  114.     start_time = get_current_time();
  115.     mptr = get_and_set_debugs(argc, argv, check_args);
  116.     num_msgs = argc - mptr;
  117.     if (num_msgs <= 0)
  118. panic(0, "%s", usage);
  119.     msgs = gw_malloc(sizeof(Octstr *) * num_msgs);
  120.     for (i = 0; i < num_msgs; i ++) {
  121. msgs[i] = octstr_create(argv[mptr + i]);
  122. octstr_append_char(msgs[i], 10); /* End of line */
  123.     }
  124.     info(0, "Host %s Port %d interval %.3f max-messages %ld",
  125.  octstr_get_cstr(host), port, interval, max_send);
  126.     srand((unsigned int) time(NULL));
  127.     info(0, "fakesmsc starting");
  128.     server = conn_open_tcp(host, port, NULL);
  129.     if (server == NULL)
  130. panic(0, "Failed to open connection");
  131.     num_sent = 0;
  132.     num_received = 0;
  133.     first_received_at = 0;
  134.     first_sent_at = 0;
  135.     last_received_at = 0;
  136.     last_sent_at = 0;
  137.     num_sent = 0;
  138.     while (1) {
  139. if (num_sent < max_send) {
  140.     if (conn_write(server, choose_message(msgs, num_msgs)) == -1)
  141. panic(0, "write failed");
  142.     ++num_sent;
  143.     if (num_sent == max_send)
  144. info(0, "fakesmsc: sent message %ld", num_sent);
  145.     else
  146. debug("send", 0, "fakesmsc: sent message %ld", num_sent);
  147.     last_sent_at = get_current_time();
  148.     if (first_sent_at == 0)
  149. first_sent_at = last_sent_at;
  150. }
  151. do {
  152.     delta = interval * num_sent - (get_current_time() - first_sent_at);
  153.     if (delta < 0)
  154. delta = 0;
  155.     if (num_sent >= max_send)
  156. delta = -1;
  157.     conn_wait(server, delta);
  158.     if (conn_read_error(server) || conn_eof(server) || sigint_received)
  159. goto over;
  160.     while ( (line = conn_read_line(server)) ) {
  161. last_received_at = get_current_time();
  162. if (first_received_at == 0)
  163.     first_received_at = last_received_at;
  164. ++num_received;
  165. if (num_received == max_send) {
  166.     info(0, "Got message %ld: <%s>", num_received,
  167.  octstr_get_cstr(line));
  168. } else {
  169.     debug("receive", 0, "Got message %ld: <%s>", num_received,
  170.  octstr_get_cstr(line));
  171. }
  172. octstr_destroy(line);
  173.     }
  174. } while (delta > 0 || num_sent >= max_send);
  175.     }
  176. over:
  177.     conn_destroy(server);
  178.     for (i = 0; i < num_msgs; i ++)
  179. octstr_destroy(msgs[i]);
  180.     gw_free(msgs);
  181.     end_time = get_current_time();
  182.     info(0, "fakesmsc: %ld messages sent and %ld received",
  183.  num_sent, num_received);
  184.     info(0, "fakesmsc: total running time %.1f seconds",
  185.  end_time - start_time);
  186.     delta = last_sent_at - first_sent_at;
  187.     if (delta == 0)
  188. delta = .01;
  189.     if (num_sent > 1)
  190. info(0, "fakesmsc: from first to last sent message %.1f s, "
  191.      "%.1f msgs/s", delta, (num_sent - 1) / delta);
  192.     delta = last_received_at - first_received_at;
  193.     if (delta == 0)
  194. delta = .01;
  195.     if (num_received > 1)
  196. info(0, "fakesmsc: from first to last received message %.1f s, "
  197.      "%.1f msgs/s", delta, (num_received - 1) / delta);
  198.     info(0, "fakesmsc: terminating");
  199.     return 0;
  200. }