dgTest.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:8k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dgTest.c - datagram test sender/receiver demo */
  2. /*
  3. modification history
  4. --------------------
  5. 01e,25may95,jcf  new environment variables
  6. 01d,16mar94,yao  fixed to support IRIX 4.0.5 tool.
  7. 01c,15feb93,jcf  added mixed endian support.
  8. 01b,31oct91,rrr  passed through the ansification filter
  9.   -removed include of netdb.h
  10.   -changed includes to have absolute path from h/
  11.   -fixed #else and #endif
  12.   -changed VOID to void
  13.   -changed copyright notice
  14. 01a,10jun88,gae  written based on rdc's test programs.
  15. */
  16. /*
  17. DESCRIPTION
  18. This demonstration module shows how to send and receive UDP packets
  19. from VxWorks to UNIX and any combination thereof.
  20. Firstly, a receiver, or receivers, are initiated on VxWorks and/or
  21. UNIX.  It will wait for packets on an agreed port number.
  22. Then a sender, again on either UNIX or VxWorks, begins sending packets.
  23. The receiver will terminate after an agreed number of packets are sent.
  24. EXAMPLE
  25.     -> sp dgReceiver
  26.     -> dgSender "127.1"
  27.     ... output from dgReceiver
  28.     -> dgHelp
  29. A few global variables are defined: verbose, terminate, and broadcast.
  30. If verbose is true then extra diagnostics are printed.
  31. If terminate is set to true while dgReceiver is running then it will
  32. exit gracefully (after the first packet).
  33. If broadcast is set to true then dgSender will broadcast the packets.
  34. */
  35. #ifdef CPU
  36. #include "vxWorks.h"
  37. #include "sys/types.h"
  38. #include "ioLib.h"
  39. #include "fioLib.h"
  40. #include "stdio.h"
  41. #include "unistd.h"
  42. #include "string.h"
  43. #include "usrLib.h"
  44. #include "errnoLib.h"
  45. #include "hostLib.h"
  46. #include "sockLib.h"
  47. #include "socket.h"
  48. #include "inetLib.h"
  49. #include "in.h"
  50. #else
  51. #include <sys/types.h>
  52. #include <sys/socket.h>
  53. #include <netinet/in.h>
  54. #include <arpa/inet.h>
  55. #define BOOL int
  56. #define LOCAL static
  57. #define IMPORT extern
  58. #define ERROR -1
  59. #define NULL 0
  60. #define TRUE 1
  61. #define FALSE 0
  62. #endif
  63. #define TORF(x) ((x) ? "True" : "False")
  64. #define PACKET_SIZE 100  /* size of UDP packets */
  65. #define PACKET_NUM 500 /* maximum number of packets */
  66. IMPORT char sysBootHost[]; /* VxWorks boot hostname */
  67. typedef struct /* PACKET */
  68.     {
  69.     int sequence;
  70.     int spare;
  71.     char data [PACKET_SIZE - 2 * sizeof (int)];
  72.     } PACKET;
  73. BOOL broadcast       = FALSE; /* when TRUE dgSender will broadcast */
  74. BOOL verbose         = FALSE; /* when TRUE extra diagnostics are displayed */
  75. BOOL terminate       = FALSE; /* when TRUE dgReceiver will quit */
  76. BOOL is42            = FALSE; /* when FALSE socket is set for broadcast */
  77. int dgPort           = 1101; /* default */
  78. int dgPackets        = 5; /* default */
  79. #ifdef POLL
  80. int fionread         = FIONREAD;/* VxWorks value (different from UNIX) */
  81. #endif
  82. /*******************************************************************************
  83. *
  84. * dgSender - send UDP datagrams
  85. */
  86. void dgSender (host, port, packets)
  87.     char *host; /* NULL = use default */
  88.     int port; /* 0 = use default */
  89.     int packets; /* 0 = use default */
  90.     {
  91.     struct in_addr destNet;
  92.     u_long inetaddr;
  93.     struct sockaddr_in sockaddr;
  94.     int optval = 1;
  95.     PACKET packet;
  96.     int ix;
  97.     int s;
  98.     if (host == NULL)
  99. host = sysBootHost;
  100.     if ((inetaddr = hostGetByName (host)) == ERROR &&
  101. (inetaddr = inet_addr (host)) == ERROR)
  102. {
  103. printf ("invalid host: <%s>n", host);
  104. return;
  105. }
  106.     if (broadcast)
  107. {
  108. #ifdef CPU
  109. struct in_addr tmp;
  110. tmp.s_addr = inetaddr;
  111. destNet  = inet_makeaddr (inet_netof (tmp), INADDR_BROADCAST);
  112. inetaddr = destNet.s_addr;
  113. #else
  114. #if (WIND_HOST_TYPE==iris)
  115. struct in_addr tmp;
  116. tmp.s_addr = inetaddr;
  117. destNet  = inet_makeaddr (inet_netof (tmp), INADDR_BROADCAST);
  118. inetaddr = destNet.s_addr;
  119. #else
  120. destNet = inet_makeaddr (inet_netof (inetaddr), INADDR_BROADCAST);
  121. #endif /* WIND_HOST_TYPE==iris */
  122. #endif
  123. if (verbose)
  124.     printf ("broadcast ");
  125. }
  126.     if (verbose)
  127. printf ("inet address = %#xn", htonl(inetaddr));
  128.     s = socket (AF_INET, SOCK_DGRAM, 0); /* get a udp socket */
  129.     if (s < 0)
  130. {
  131. printf ("socket error (errno = %#x)n", errnoGet ());
  132. return;
  133. }
  134.     if (!is42)
  135. {
  136. /* BSD 4.2 doesn't have or require turning on of broadcasting */
  137. if (setsockopt (s, SOL_SOCKET, SO_BROADCAST,
  138. (caddr_t) &optval, sizeof (optval)) < 0)
  139.     {
  140.     printf ("setsockopt error (errno = %#x)n", errnoGet ());
  141.     return;
  142.     }
  143. }
  144.     if (port == 0)
  145. port = dgPort;
  146.     if (packets == 0)
  147. packets = dgPackets;
  148.     bzero ((char *) &packet, sizeof (PACKET));
  149.     bzero ((char *) &sockaddr, sizeof (sockaddr));
  150.     sockaddr.sin_family      = AF_INET;
  151.     sockaddr.sin_addr.s_addr = inetaddr;
  152.     sockaddr.sin_port        = htons (port);
  153.     /* send the datagrams */
  154.     for (ix = 0; ix < packets; ix++)
  155. {
  156. packet.sequence = htonl (ix);
  157. /* send it */
  158. if (sendto (s, (caddr_t) &packet, sizeof (packet), 0,
  159.     (struct sockaddr *)&sockaddr, sizeof (sockaddr)) == -1)
  160.     {
  161.     printf ("sendto error on packet # %d (errno = %#x)n",
  162.     ix, errnoGet ());
  163.     close (s);
  164.     return;
  165.     }
  166. }
  167.     printf ("sent %d packetsn", ix);
  168.     close (s);
  169.     }
  170. /*******************************************************************************
  171. *
  172. * dgReceiver -
  173. */
  174. void dgReceiver (port, packets)
  175.     int port;
  176.     int packets;
  177.     {
  178.     struct sockaddr_in sockaddr;
  179.     int sockaddrLen = sizeof (sockaddr);
  180.     int nBytes;
  181.     int ix;
  182.     BOOL missing;
  183.     char packetList [PACKET_NUM]; /* boolean array of received packets */
  184.     PACKET packet;
  185.     int nPacketsReceived = 0;
  186.     int s = socket (AF_INET, SOCK_DGRAM, 0);
  187.     if (s < 0)
  188. {
  189. printf ("socket error (errno = %#x)n", errnoGet ());
  190. return;
  191. }
  192. #ifdef REUSE
  193.     if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR,
  194.      (caddr_t) &optval, sizeof (optval)) < 0)
  195. {
  196. printf ("setsockopt error (errno = %#x)n", errnoGet ());
  197. return;
  198. }
  199. #endif /* REUSE */
  200.     if (port == 0)
  201. port = dgPort;
  202.     if (packets == 0)
  203. packets = dgPackets;
  204.     /* clear out the packetList */
  205.     bzero ((char *) packetList, sizeof (packetList));
  206.     bzero ((char *) &sockaddr, sizeof (sockaddr));
  207.     sockaddr.sin_family      = AF_INET;
  208.     sockaddr.sin_port        = htons (port);
  209.     if (bind (s, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) == ERROR)
  210. {
  211. printf ("bind error (errno = %#x)n", errnoGet ());
  212. return;
  213. }
  214.     if (getsockname (s, (struct sockaddr *) &sockaddr, &sockaddrLen) == ERROR)
  215. {
  216. printf ("getsockname error (errno = %#x)n", errnoGet ());
  217. return;
  218. }
  219.     terminate = FALSE;
  220.     while (packets > nPacketsReceived)
  221. {
  222. #ifdef POLL
  223. if (ioctl (s, fionread, &nBytes) == ERROR)
  224.     {
  225.     printf ("ioctl error (errno = %#x)n", errnoGet ());
  226.     close (s);
  227.     return;
  228.     }
  229. if (nBytes > 0)
  230. #endif /* POLL */
  231.     {
  232.     nBytes = recvfrom (s, (caddr_t) &packet, sizeof (PACKET), 0,
  233.        (struct sockaddr *) &sockaddr, &sockaddrLen);
  234.     if (verbose)
  235. printf ("received packet # %dn", ntohl(packet.sequence));
  236.     packetList [ntohl(packet.sequence)] = TRUE;
  237.     nPacketsReceived++;
  238.     }
  239. if (terminate)
  240.     {
  241.     printf ("terminatedn");
  242.     break;
  243.     }
  244. }
  245.     missing = FALSE;
  246.     nPacketsReceived = 0;
  247.     for (ix = 0; ix < packets; ix++)
  248. {
  249. if (packetList[ix] == TRUE)
  250.     nPacketsReceived++;
  251. else
  252.     {
  253.     missing = TRUE;
  254.     printf ("%dn", ix);
  255.     }
  256. }
  257.     printf ("n%smissing packetsn", missing ? "" : "no ");
  258.     printf ("%d packets receivedn", nPacketsReceived);
  259.     close (s);
  260.     }
  261. /*******************************************************************************
  262. *
  263. * dgHelp -
  264. */
  265. void dgHelp ()
  266.     {
  267.     printf ("dgHelp                             show this listn");
  268.     printf ("dgReceiver [port],[packets]        receive datagramsn");
  269.     printf ("dgSender [host],[port],[packets]   send datagramsn");
  270.     printf ("n");
  271.     printf ("broadcast                = %sn", TORF(broadcast));
  272.     printf ("host                     = %sn", sysBootHost);
  273.     printf ("port number              = %dn", dgPort);
  274.     printf ("number of packets        = %dn", dgPackets);
  275.     printf ("verbose                  = %sn", TORF(verbose));
  276.     printf ("n");
  277.     }