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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2. *  dgrecv.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 waiting for a datagram packet.
  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 "../testlib/testlib.h"
  18. /*
  19. *   Sockaddr structures 
  20. */
  21. SOCKADDR_IPX addr;
  22. SOCKADDR_IPX baddr;
  23. SOCKADDR_IPX raddr;
  24. /*
  25. *   Function Prototypes 
  26. */
  27. extern int main(int, char **);
  28. extern int net_init(SOCKET *);
  29. extern int dg_recv(SOCKET);
  30. /****************************************************************************
  31. *
  32. *    FUNCTION:  main( int argc, char **argv )
  33. *
  34. *    PURPOSE:   This is the main entry for the program
  35. *        
  36. *
  37. *    ARGUMENTS: argc = Number of arguments
  38. *               argv = Array of ptrs to cmd line args
  39. *                
  40. *
  41. *  RETURNS:   Exit code for the program
  42. *
  43. ****************************************************************************/
  44. int main(int argc, char **argv)
  45. {
  46.     SOCKET s;
  47.     /*
  48.     *   Initialize our default values before checking the command line 
  49.     */
  50.     *Local_Socket_Number = 0x06;
  51.     *(Local_Socket_Number+1) = 0x00;
  52.     /*
  53.     *   Parse the command line to set up any command line options 
  54.     */
  55.     parse_cmd_line(argc, argv);
  56.     /*
  57.     *   Initialize the network and set up our socket 
  58.     */
  59.     if (net_init(&s))
  60.         return 1;
  61.     /*
  62.     *   Do the receive thing 
  63.     */
  64.     if (dg_recv(s))
  65.         return 1;
  66.     /*
  67.     *   All Done - Close up the socket and exit 
  68.     */
  69.     if (verbose)
  70. printf("Calling closesocket()n");
  71.     closesocket(s);
  72.     return 0;
  73. }
  74. /****************************************************************************
  75. *
  76. *    FUNCTION:  net_init( SOCKET *skt )
  77. *
  78. *    PURPOSE:   Initializes the WinSock stuff and sets up our socket.
  79. *        
  80. *
  81. *    ARGUMENTS: SOCKET * => struct to receive our socket info
  82. *
  83. *  RETURNS:   0 if ok
  84. * 1 if error
  85. *
  86. ****************************************************************************/
  87. int net_init(SOCKET *skt)
  88. {
  89.     SOCKET s;
  90.     int rc, addrlen = 16;
  91.     WSADATA wsdata;
  92.     WORD    wVersionRequested;
  93.     if (verbose)
  94.         printf("Calling WSAStartup(), ");
  95.     /*
  96.     *   Initialize with the WINSOCK library 
  97.     */
  98.     wVersionRequested = MAKEWORD(1,1);
  99.     rc = WSAStartup(wVersionRequested, &wsdata);
  100.     if (verbose)
  101.         printf("return = 0x%X (%d)n", rc, rc);
  102.     if (rc) {
  103.         printf("WSAStartup failed: error code = %dn", rc);
  104.         return 1;
  105.     }
  106.     if (verbose) {
  107.         printf("Contents of wsadata struct:n");
  108.         print_wsa(&wsdata);
  109.     }
  110.     /*
  111.     *   Open a DATAGRAM socket with IPX 
  112.     */
  113.     if (verbose)
  114.         printf("Calling socket(address family = %d, socket type = %d, protocol = %d)n", Local_Address_Family, Socket_Type, Protocol);
  115.     s = socket(Local_Address_Family, Socket_Type, Protocol);
  116.     if (verbose)
  117. printf("socket() returned 0x%X (%d)n", s, s);
  118.     if (s == INVALID_SOCKET) {
  119.         dos_net_perror("Socket call failed");
  120.         exit(1);
  121.     }
  122.     /*
  123.     *    Bind to a socket.  We dont care what socket we bind to,
  124.     *    so we will send down all 0's
  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(), local address =n  ");
  132.         print_saddr(&addr);
  133.     }
  134.     rc = bind(s, (struct sockaddr *) &addr, 16);
  135.     if (verbose)
  136.         printf("nbind() returned 0x%X (%d)n", rc, rc);
  137.     if (rc == SOCKET_ERROR) {
  138.         dos_net_perror("Error binding to socket");
  139.         closesocket(s);
  140.         return 1;
  141.     }
  142.     /*
  143.     *   Get the address we bound to and print it out 
  144.     */
  145.     if (verbose)
  146.         printf("calling getsockname(socket = %d), ", s);
  147.     rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen);
  148.     if (verbose)
  149.         printf("return = 0x%lX (%d)n", rc, rc);
  150.     if (rc == SOCKET_ERROR) {
  151.         dos_net_perror("Error getting socket name");
  152.         closesocket(s);
  153.         return 1;
  154.     }
  155.     /*
  156.     *   Set the packet type to send for this socket 
  157.     */
  158.     if (verbose)
  159.         printf("Calling setsockopt for packet type %dn", Local_Packet_Type);
  160.     rc = setsockopt(s, NSPROTO_IPX, IPX_PTYPE, (const char *) &Local_Packet_Type, 4);
  161.     if (rc == SOCKET_ERROR)
  162.         dos_net_perror("setsockopt() call failed");
  163.     if (Filter_Packet_Type) {
  164.         /*
  165.         *   Set the packet type for this socket 
  166.         */
  167.         if (verbose)
  168.             printf("Calling setsockopt to filter packet type %dn", Filter_Packet_Type);
  169. rc = setsockopt(s, NSPROTO_IPX, IPX_FILTERPTYPE, (const char *) &Filter_Packet_Type, sizeof(int));
  170. printf("RC from FILTER SOCKOPT = %dn", rc);
  171.         if (rc == SOCKET_ERROR)
  172.             dos_net_perror("setsockopt() call failed setting filter packet type");
  173.     }
  174.     /*
  175.     *   Print out the network address 
  176.     */
  177.     if (verbose) {
  178.         printf("addrlen = %dn", addrlen);
  179.         print_netaddr(baddr.sa_netnum, "  Bound to address ", "n");
  180.     }
  181.     *skt = s;
  182.     return 0;
  183. }
  184. /****************************************************************************
  185. *
  186. *    FUNCTION:  dg_recv( SOCKET s )
  187. *
  188. *    PURPOSE:   Receives datagrams.
  189. *
  190. *    ARGUMENTS: SOCKET   socket to receive on
  191. *
  192. *  RETURNS:   0 if ok
  193. *               1 if error
  194. *
  195. ****************************************************************************/
  196. int dg_recv(SOCKET s)
  197. {
  198.     int rc, errflag = 0;
  199.     int addrlen = 16;
  200.     UINT dgrams = 0;
  201.     LPSTR recvbuf;
  202.     if (verbose)
  203.         printf("allocating %d bytes for receive buffern", Receive_Length);
  204.     /*
  205.     *   Set up the data buffer to send 
  206.     */
  207.     recvbuf = (LPSTR)malloc(Send_Length);
  208.     if (!recvbuf) {
  209.         printf("Error allocating %d bytes for receive buffern", Receive_Length);
  210.         return 1;
  211.     }
  212.     if (verbose) {
  213.         printf("calling recvfrom(socket = %d, length = %d),n", s, Receive_Length);
  214.     }
  215.     else
  216.         printf("Waiting for call...n");
  217.     while (1) {
  218.         /*
  219.         *   Receive a packet from anyone 
  220.         */
  221.         rc = recvfrom(s, recvbuf, Receive_Length, 0, (struct sockaddr *)&raddr, &addrlen);
  222.         if (rc == SOCKET_ERROR) {
  223.             dos_net_perror("recvfrom() failed");
  224.             errflag++;
  225.             break;
  226.         }
  227.         if (verbose) {
  228.             printf("Received %d bytes from n  ", rc);
  229.             print_saddr(&raddr);
  230.             printf("n");
  231.         }
  232.         else
  233.             printf("rReceived packet %d, length = %d bytes", ++dgrams, rc);
  234.         if (No_Loop)
  235.             break;
  236.     }
  237.     if (verbose)
  238.         printf("Freeing receive buffern");
  239.     free(recvbuf);
  240.     return errflag;
  241. }