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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2. *  ping.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, receiving a packet and sending
  9. *  that packet back to the original sender.
  10. ****************************************************************************/
  11. #include <windows.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <malloc.h>
  16. #include <wsipx.h>
  17. #include <wsnwlink.h>
  18. #include "../testlib/testlib.h"
  19. /*
  20. *   Sockaddr structures 
  21. */
  22. SOCKADDR_IPX addr;
  23. SOCKADDR_IPX baddr;
  24. SOCKADDR_IPX raddr;
  25. int addrlen;
  26. /*
  27. *   Function Prototypes 
  28. */
  29. extern int main(int, char **);
  30. extern int net_init(SOCKET *);
  31. extern int do_ping(SOCKET);
  32. /****************************************************************************
  33. *
  34. *    FUNCTION:  main( int argc, char **argv )
  35. *
  36. *    PURPOSE:   This is the main entry for the program
  37. *        
  38. *
  39. *    ARGUMENTS: argc = Number of arguments
  40. *               argv = Array of ptrs to cmd line args
  41. *                
  42. *
  43. *  RETURNS:   Exit code for the program
  44. *
  45. ****************************************************************************/
  46. int main(int argc, char **argv)
  47. {
  48.     SOCKET s;
  49.     /*
  50.     *   Set our default values before calling parse_cmd_line 
  51.     */
  52.     *Local_Socket_Number = 0x30;
  53.     *(Local_Socket_Number+1) = 0x00;
  54.     Receive_Length = 2048;
  55.     /*
  56.     *   Get any command line options 
  57.     */
  58.     parse_cmd_line(argc, argv);
  59.     /*
  60.     *   Initialize the network and set up our socket 
  61.     */
  62.     if (net_init(&s))
  63.         return 1;
  64.     do_ping(s);
  65.     /*
  66.     *   All done (We only get here on error) 
  67.     */
  68.     if (verbose)
  69.         printf("calling closesocket()");
  70.     closesocket(s);
  71.     return 0;
  72. }
  73. /****************************************************************************
  74. *
  75. *    FUNCTION:  net_init( SOCKET *skt )
  76. *
  77. *    PURPOSE:   Initializes the WinSock stuff and sets up our socket.
  78. *        
  79. *
  80. *    ARGUMENTS: SOCKET * => struct to receive our socket info
  81. *
  82. *  RETURNS:   0 if ok
  83. * 1 if error
  84. *
  85. ****************************************************************************/
  86. int net_init(SOCKET *skt)
  87. {
  88.     int rc, addrlen;
  89.     WSADATA wsdata;
  90.     SOCKET s;
  91.     WORD    wVersionRequested;
  92.     /*
  93.     *   Initialize with the WINSOCK library 
  94.     */
  95.     if (verbose)
  96.         printf("calling WSAStartup(), ");
  97.     wVersionRequested = MAKEWORD(1,1);
  98.     rc = WSAStartup(wVersionRequested, &wsdata);
  99.     if (verbose)
  100.         printf("return = 0x%X (%d)n", rc, rc);
  101.     if (rc) {
  102.         printf("WSAStartup failed: error code = %dn", rc);
  103.         return 1;
  104.     }
  105.     if (verbose) {
  106.         printf("contents of wsdata struct: n");
  107.         print_wsa(&wsdata);
  108.     }
  109.     if (verbose)
  110.         printf("calling socket(address family = %d, socket type = %d, protocol = %d)n", Local_Address_Family, Socket_Type, Protocol);
  111.     /*
  112.     *   Open a DATAGRAM socket with IPX 
  113.     */
  114.     s = socket(AF_NS, SOCK_DGRAM, NSPROTO_IPX);
  115.     if (verbose)
  116.         printf("socket() returned 0x%lXn", s);
  117.     if (s == INVALID_SOCKET) {
  118.         dos_net_perror("Socket call failed");
  119.         exit(1);
  120.     }
  121.     /*
  122.     *   Bind to a socket.  We want to bind to a well known
  123.     *   socket so that the app. that sends us a packet will
  124.     *   know where to send it.
  125.     */
  126.     addr.sa_family = Local_Address_Family;
  127.     memcpy(&addr.sa_netnum, Local_Network_Number, 4);
  128.     memcpy(&addr.sa_nodenum, Local_Node_Number, 6);
  129.     memcpy(&addr.sa_socket, Local_Socket_Number, 2);
  130.     if (verbose) {
  131.         printf("calling bind():n  ");
  132.         print_saddr(&addr);
  133.     }
  134.     rc = bind(s, (const struct sockaddr *) &addr, 16);
  135.     if (verbose)
  136.         printf("bind() returned 0x%Xn", rc);
  137.     if (rc == SOCKET_ERROR) {
  138.         dos_net_perror("Error binding to socket");
  139.         closesocket(s);
  140.         return 1;
  141.     }
  142.     /*
  143.     *   Set the packet type for this socket 
  144.     */
  145.     if (verbose)
  146.         printf("Calling setsockopt for packet type %dn", Local_Packet_Type);
  147.     rc = setsockopt(s, SOL_SOCKET, IPX_PTYPE, (const char *) &Local_Packet_Type, 4);
  148.     if (rc == SOCKET_ERROR)
  149.         dos_net_perror("setsockopt() call failed");
  150.     /*
  151.     *   Get the address we bound to and print it out 
  152.     */
  153.     if (verbose)
  154.         printf("Calling getsockname(socket = %d), ");
  155.     addrlen = 16;
  156.     rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen);
  157.     if (verbose)
  158.         printf("return = 0x%X (%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.     *   Print out the network address 
  166.     */
  167.     if (verbose) {
  168.         printf("addrlen = %dn", addrlen);
  169.         print_netaddr(baddr.sa_netnum, "Bound address = ", "n");
  170.     }
  171.     if (verbose)
  172.         printf("Allocating %d byte receive buffern", Receive_Length);
  173.     /*
  174.     *   Set up socket to send back 
  175.     */
  176.     *skt = s;
  177.     return 0;
  178. }
  179. /****************************************************************************
  180. *
  181. *    FUNCTION:  do_ping( SOCKET s )
  182. *
  183. *    PURPOSE:   This will receive a packet then send it back.
  184. *        
  185. *    ARGUMENTS: SOCKET socket we are transmitting on.
  186. *
  187. *  RETURNS:   0 if ok
  188. * 1 if error
  189. *
  190. ****************************************************************************/
  191. int do_ping(SOCKET s)
  192. {
  193.     LPSTR recvbuf;
  194.     int nbytes, rc, errflag = 0;
  195.     int rcvpkts = 0, sndpkts = 0;
  196.     /*
  197.     *   Allocate a buffer for receives 
  198.     */
  199.     recvbuf = malloc(Receive_Length);
  200.     if (!recvbuf) {
  201.         printf("Error allocating %d bytes for receive buffern", Receive_Length);
  202.         return 1;
  203.     }
  204.     /*
  205.     *   This loop will receive a packet and then send
  206.     *   it back to whoever sent it to us.
  207. *
  208. *      To exit the loop - hit CTRL-C.
  209.     */
  210.     while (1) {
  211.         /*
  212.         *   Recv a packet 
  213.         */
  214.         /*
  215.         *    NOTE:  If you want to know the packet type field of the
  216.         *           packet you just received, look at the byte at
  217. *           raddr.sa_ptype.  The addrlen returned will be
  218. *           15.
  219. *
  220.         *           By using the addrlen field unchanged when sending
  221.         *           the packet back, you will send the packet back with
  222.         *           the same packet type that is was sent with originally
  223.         */
  224.         addrlen = 16;
  225.         if (verbose)
  226.             printf("calling recvfrom(socket = %d, len = %d)n", s, Receive_Length);
  227.         nbytes = recvfrom(s, recvbuf, Receive_Length, 0, (struct sockaddr *) &raddr, &addrlen);
  228.         /*
  229.         *   If error - print it and exit 
  230.         */
  231.         if (nbytes == SOCKET_ERROR) {
  232.             dos_net_perror("recvfrom() failed");
  233.             errflag++;
  234.             break;
  235.         }
  236.         if (verbose) {
  237.             printf("received %d bytes, raddr = n  ", nbytes);
  238.             print_saddr(&raddr);
  239.         }
  240.         if (!verbose)
  241.             printf("rRecv packet number %d", ++rcvpkts);
  242.         /*
  243.         *   Send the data back 
  244.         */
  245.         if (verbose)
  246.             printf("calling sendto(socket = %d, len = %dn", s, nbytes);
  247. addrlen = 16;
  248.         rc = sendto(s, recvbuf, nbytes, 0, (const struct sockaddr *) &raddr, addrlen);
  249.         if (verbose)
  250.             printf("sendto() returned 0x%Xn", rc);
  251.         if (rc == SOCKET_ERROR) {
  252.             dos_net_perror("sendto() failed");
  253.             errflag++;
  254.             break;
  255.         }
  256.         if (!verbose)
  257.             printf(" : Send packet number %d", ++sndpkts);
  258.     }
  259.     if (verbose)
  260.         printf("Freeing receive buffern");
  261.     free(recvbuf);
  262.     return errflag;
  263. }