DGSEND.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:10k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2. *  dgsend.c -- sample program demonstrating NWLink.
  3. *
  4. *       Microsoft Developer Support
  5. *       Copyright (c) 1992-1997 Microsoft Corporation
  6. *
  7. *   This program is a simple example of opening a socket,
  8. *   binding to the socket, and sending a packet repeatedly.
  9. ****************************************************************************/
  10. #include <windows.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <malloc.h>
  15. #include <wsipx.h>
  16. #include <wsnwlink.h>
  17. #include "..testlibtestlib.h"
  18. /*
  19. *   Sockaddr structures 
  20. */
  21. SOCKADDR_IPX addr;
  22. SOCKADDR_IPX baddr;
  23. SOCKADDR_IPX saddr;
  24. /*
  25. *   Data for sending 
  26. */
  27. char send_data[] = "This is an IPX packet from NT";
  28. /*
  29. *   Function Prototypes 
  30. */
  31. extern int main(int, char **);
  32. extern int net_init(SOCKET *);
  33. extern int enable_broadcasts(SOCKET);
  34. extern void build_dest_addr(SOCKET, PSOCKADDR_IPX);
  35. extern int dg_send(SOCKET);
  36. /****************************************************************************
  37. *
  38. *    FUNCTION:  main( int argc, char **argv )
  39. *
  40. *    PURPOSE:   This is the main entry for the program
  41. *        
  42. *
  43. *    ARGUMENTS: argc = Number of arguments
  44. *               argv = Array of ptrs to cmd line args
  45. *                
  46. *
  47. *  RETURNS:   Exit code for the program
  48. *
  49. ****************************************************************************/
  50. int main(int argc, char **argv)
  51. {
  52.     SOCKET s;
  53.     /*
  54.     *   Fill in any default values before checking the command line 
  55.     */
  56.     *Remote_Socket_Number = 0x06;
  57.     *(Remote_Socket_Number+1) = 0x00;
  58.     Sleep_Time = 500;
  59.     /*
  60.     *   Parse the command line to set up any command line options 
  61.     */
  62.     parse_cmd_line(argc, argv);
  63.     if (net_init(&s))
  64.         return 1;
  65.     if (!No_Broadcast) {
  66.         if (enable_broadcasts(s))
  67.             return 1;
  68.     }
  69.     build_dest_addr(s, &saddr);
  70.     /*
  71.     *   Send some datagrams 
  72.     */
  73.     dg_send(s);
  74.     /*
  75.     *   All Done - Close up the socket and exit 
  76.     */
  77.     if (verbose)
  78. printf("Calling closesocket()n");
  79.     closesocket(s);
  80.     return 0;
  81. }
  82. /****************************************************************************
  83. *
  84. *    FUNCTION:  net_init( SOCKET *skt )
  85. *
  86. *    PURPOSE:   Initializes the WinSock stuff and sets up our socket.
  87. *        
  88. *
  89. *    ARGUMENTS: SOCKET * => struct to receive our socket info
  90. *
  91. *  RETURNS:   0 if ok
  92. * 1 if error
  93. *
  94. ****************************************************************************/
  95. int net_init(SOCKET *skt)
  96. {
  97.     SOCKET s;
  98.     WSADATA wsdata;
  99.     WORD    wVersionRequested;
  100.     int rc, addrlen = 16;
  101.     if (verbose)
  102.         printf("Calling WSAStartup(), ");
  103.     /*
  104.     *   Initialize with the WINSOCK library 
  105.     */
  106.     wVersionRequested = MAKEWORD(1,1);
  107.     rc = WSAStartup(wVersionRequested, &wsdata);
  108.     if (verbose)
  109.         printf("return = 0x%X (%d)n", rc, rc);
  110.     if (rc) {
  111.         printf("WSAStartup failed: error code = %dn", rc);
  112.         return 1;
  113.     }
  114.     if (verbose) {
  115.         printf("Contents of wsadata struct:n");
  116.         print_wsa(&wsdata);
  117.     }
  118.     /*
  119.     *   Open a DATAGRAM socket with IPX 
  120.     */
  121.     if (verbose)
  122.         printf("Calling socket(address family = %d, socket type = %d, protocol = %d)n", Local_Address_Family, Socket_Type, Protocol);
  123.     s = socket(Local_Address_Family, Socket_Type, Protocol);
  124.     if (verbose)
  125. printf("socket() returned 0x%X (%d)n", s, s);
  126.     if (s == INVALID_SOCKET) {
  127.         dos_net_perror("Socket call failed");
  128.         exit(1);
  129.     }
  130.     /*
  131.     *   Bind to a socket.  We dont care what socket we bind to,
  132.     *   so we will send down all 0's
  133.     */
  134.     addr.sa_family = Local_Address_Family;
  135.     memcpy(&addr.sa_netnum, Local_Network_Number, 4);
  136.     memcpy(&addr.sa_nodenum, Local_Node_Number, 6);
  137.     memcpy(&addr.sa_socket, Local_Socket_Number, 2);
  138.     if (verbose) {
  139.         printf("calling bind(), local address =n  ");
  140.         print_saddr(&addr);
  141.     }
  142.     rc = bind(s, (const struct sockaddr *) &addr, 16);
  143.     if (verbose)
  144.         printf("nbind() returned 0x%X (%d)n", rc, rc);
  145.     if (rc == SOCKET_ERROR) {
  146.         dos_net_perror("Error binding to socket");
  147.         printf("Socket = 0x%lxn", s);
  148.         closesocket(s);
  149.         return 1;
  150.     }
  151.     /*
  152.     *   Get the address we bound to and print it out 
  153.     */
  154.     if (verbose)
  155.         printf("calling getsockname(socket = %d), ", s);
  156.     rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen);
  157.     if (verbose)
  158.         printf("return = 0x%lX (%d)n", rc, rc);
  159.     if (rc == SOCKET_ERROR) {
  160.         dos_net_perror("Error getting socket name");
  161.         closesocket(s);
  162.         return 1;
  163.     }
  164.     /*
  165.     *   Set the packet type for this socket 
  166.     */
  167.     if (verbose)
  168.         printf("Calling setsockopt for packet type %dn", Local_Packet_Type);
  169.     rc = setsockopt(s, NSPROTO_IPX, IPX_PTYPE, (const char *) &Local_Packet_Type, 4);
  170.     if (rc == SOCKET_ERROR)
  171.         dos_net_perror("setsockopt() call failed");
  172.     /*
  173.     *   Print out the network address 
  174.     */
  175.     if (verbose) {
  176.         printf("addrlen = %dn", addrlen);
  177.         print_netaddr(baddr.sa_netnum, "  Bound to address ", "n");
  178.     }
  179.     *skt = s;
  180.     return 0;
  181. }
  182. /****************************************************************************
  183. *
  184. *    FUNCTION:  enable_broadcasts( SOCKET s )
  185. *
  186. *    PURPOSE:   Sets the socket option to enable broadcast sends on it.
  187. *        
  188. *
  189. *    ARGUMENTS: SOCKET   socket to enable
  190. *
  191. *  RETURNS:   0 if ok
  192. * 1 if error
  193. *
  194. ****************************************************************************/
  195. int enable_broadcasts(SOCKET s)
  196. {
  197.     int rc;
  198.     BOOL optval = TRUE;
  199.     /*
  200.     *   Enable sending of broadcasts 
  201.     */
  202.     /*
  203.     *    NOTE:  This only needs to be done if you want to SEND
  204.     *           broadcast packets.  Reception of broadcast
  205.     *           packets will happen automatically.
  206.     */
  207.     if (verbose)
  208.         printf("Setting socket option to broadcast, ");
  209. rc = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(int));
  210.     if (verbose)
  211.         printf("return = 0x%X (%d)n", rc, rc);
  212.     if (rc == SOCKET_ERROR) {
  213.         dos_net_perror("Error enabling broadcast address");
  214.         closesocket(s);
  215.         return 1;
  216.     }
  217.     return 0;
  218. }
  219. /****************************************************************************
  220. *
  221. *    FUNCTION:  build_dest_addr( SOCKET s )
  222. *
  223. *    PURPOSE:   Fills in the destination address fields and sets the packet type.
  224. *        
  225. *
  226. *    ARGUMENTS: SOCKET       socket to set packet type for
  227. * PSOCKADDR_NS => address struct to fill in
  228. *
  229. *  RETURNS:   0 if ok
  230. * 1 if error
  231. *
  232. ****************************************************************************/
  233. void build_dest_addr(SOCKET s, PSOCKADDR_IPX psaddr)
  234. {
  235.     int rc;
  236.     /*
  237.     *   Build the dest. address 
  238.     */
  239.     psaddr->sa_family = Remote_Address_Family;
  240.     /*
  241.     *   Set dest. network number 
  242.     */
  243.     memcpy(&psaddr->sa_netnum, Remote_Network_Number, 4);
  244.     /*
  245.     *   Set dest. node address 
  246.     */
  247.     memcpy(&psaddr->sa_nodenum, Remote_Node_Number, 6);
  248.     /*
  249.     *   Set the dest. socket number 
  250.     */
  251.     memcpy(&psaddr->sa_socket, Remote_Socket_Number, 2);
  252.     /*
  253.     *   Set the packet type for this socket 
  254.     */
  255.     if (verbose)
  256.         printf("Calling setsockopt for packet type %dn", Send_Packet_Type);
  257.     rc = setsockopt(s, NSPROTO_IPX, IPX_PTYPE, (const char *) &Send_Packet_Type, sizeof(int));
  258.     if (rc == SOCKET_ERROR)
  259.         dos_net_perror("setsockopt() call failed");
  260.     return;
  261. }
  262. /****************************************************************************
  263. *
  264. *    FUNCTION:  dg_send( SOCKET s )
  265. *
  266. *    PURPOSE:   Receives datagrams.
  267. *
  268. *    ARGUMENTS: SOCKET socket to transmit on
  269. *
  270. *  RETURNS:   0 if ok
  271. *               1 if error
  272. *
  273. ****************************************************************************/
  274. int dg_send(SOCKET s)
  275. {
  276.     LPSTR sendbuf;
  277.     int rc, errflag = 0;
  278.     UINT dgrms = 0;
  279.     if (verbose)
  280.         printf("allocating %d bytes for send buffern", Send_Length);
  281.     /*
  282.     *   Set up the data buffer to send 
  283.     */
  284.     sendbuf = (LPSTR)malloc(Send_Length);
  285.     if (!sendbuf) {
  286.         printf("Error allocating %d bytes for send buffern", Send_Length);
  287.         return 1;
  288.     }
  289.     /*
  290.     *   Zero the buffer and copy as much of our data to it as possible 
  291.     */
  292.     memset(sendbuf, 0, Send_Length);
  293.     strncpy(sendbuf, send_data, Send_Length);
  294.     while (1) {
  295.         if (verbose) {
  296.             printf("calling sendto(socket = %d, length = %d),n", s, Send_Length);
  297.             printf("destination address:n  ");
  298.             print_saddr(&saddr);
  299.         }
  300.         /*
  301.         *   Send a packet to everybody 
  302.         */
  303.         rc = sendto(s, sendbuf, Send_Length, 0, (const struct sockaddr *) &saddr, 16);
  304.         if (verbose)
  305.     printf("nsendto() returned %dn", rc);
  306.         if (rc == SOCKET_ERROR) {
  307.             dos_net_perror("Sendto() failed");
  308.             errflag++;
  309.             break;
  310.         }
  311.         else {
  312.             printf("rSent datagram %d, length = %d bytes", ++dgrms, rc);
  313.             if (verbose)
  314.                 printf("n");
  315.         }
  316.         /*
  317.         *   If we are to send only one, break out 
  318.         */
  319.         if (No_Loop)
  320.             break;
  321.         /*
  322.         *   Sleep for a little while so we don't bombard the network 
  323.         */
  324.         Sleep(Sleep_Time);
  325.     }
  326.     if (verbose)
  327.         printf("Freeing send buffern");
  328.     free(sendbuf);
  329.     return errflag;
  330. }