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

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2. *  listen.c -- sample program demonstrating NWLink.
  3. *
  4. *       Microsoft Developer Support
  5. *       Copyright 1992 - 1997 Microsoft Corporation
  6. *
  7. *  This program is a simple example of opening a SPX socket,
  8. *  binding to the socket, and listening for a connection.
  9. *
  10. ****************************************************************************/
  11. #include <windows.h>
  12. #include <winsock.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <malloc.h>
  17. #include "wshisotp.h"
  18. /*
  19. *   Sockaddr structures
  20. */
  21. SOCKADDR_TP addr;
  22. SOCKADDR_TP baddr;
  23. SOCKADDR_TP saddr;
  24. /*
  25. *   Function Prototypes
  26. */
  27. extern int main(int, char **);
  28. extern int net_init(SOCKET *);
  29. extern int do_listen(SOCKET);
  30. extern int wait_for_connection(SOCKET, SOCKET *);
  31. extern int do_recv_send(SOCKET);
  32. char LocalNetworkAddress[22];
  33. char LocalNetworkAddressLength;
  34. short   LocalTsel;
  35. int     verbose = 1;
  36. int     Socket_Type = SOCK_SEQPACKET;
  37. int     Protocol = ISOPROTO_TP4;
  38. int     Local_Address_Family = AF_ISO;
  39. int     Remote_Address_Family = AF_ISO;
  40. int     Backlog = 1;
  41. int     No_Broadcast = 0;
  42. int     No_Loop = 0;
  43. int     Sleep_Time = 1000;
  44. int     Send_Length = 100;
  45. int     Receive_Length = 200;
  46. int     Local_Packet_Type = 0;
  47. /****************************************************************************
  48. *
  49. *    FUNCTION:  main( int argc, char **argv )
  50. *
  51. *    PURPOSE:   This is the main entry for the program
  52. *
  53. *
  54. *    ARGUMENTS: argc = Number of arguments
  55. *               argv = Array of ptrs to cmd line args
  56. *
  57. *
  58. *        RETURNS:   Exit code for the program
  59. *
  60. ****************************************************************************/
  61. int main(int argc, char **argv)
  62. {
  63.     SOCKET s, s2;
  64.    /*
  65.    ** Read Local Transport Address fields from user
  66.    */
  67.    printf("LocalNetworkAddress(max. 20 chars) : ");
  68.    scanf("%s", &LocalNetworkAddress[0]);
  69.    printf("LocalTsel : ");
  70.    scanf("%d", &LocalTsel);
  71.    LocalNetworkAddressLength = strlen(LocalNetworkAddress) ;
  72. printf("Local Tsel(%d) Net_length(%d) Net(%s)n",
  73.         LocalTsel, LocalNetworkAddressLength, LocalNetworkAddress);
  74.     /*
  75.     *   Initialize the network and set up our socket
  76.     */
  77.     if (net_init(&s))
  78.         return 1;
  79.     if (verbose)
  80.         printf("calling do_listenn");
  81.     /*
  82.     *   Go listen for a call
  83.     */
  84.     if (do_listen(s))
  85.         return 1;
  86.     /*
  87.     *   Then wait for a connection
  88.     */
  89.     if (verbose)
  90.         printf("calling wait_for_connectionn");
  91.     if (wait_for_connection(s, &s2))
  92.         return 1;
  93.     /*
  94.     *   Receive data then send it back
  95.     */
  96.     if (verbose)
  97.         printf("calling do_recv_sendn");
  98.     if (do_recv_send(s2))
  99.         return 1;
  100.     /*
  101.     *   All done
  102.     */
  103.     if (verbose)
  104.         printf("closing both socketsn");
  105.     closesocket(s2);
  106.     closesocket(s);
  107.     return 0;
  108. }
  109. /****************************************************************************
  110. *
  111. *    FUNCTION:  net_init( SOCKET *skt )
  112. *
  113. *    PURPOSE:   Initializes the WinSock stuff and sets up our socket.
  114. *
  115. *
  116. *    ARGUMENTS: SOCKET * => struct to receive our socket info
  117. *
  118. *        RETURNS:   0 if ok
  119. *                               1 if error
  120. *
  121. ****************************************************************************/
  122. int net_init(SOCKET *skt)
  123. {
  124.     int i, rc, addrlen;
  125.     WSADATA wsdata;
  126.     SOCKET s;
  127.     char *adr;
  128.     /*
  129.     *   Initialize with the WINSOCK library
  130.     */
  131.     if (verbose)
  132.         printf("calling WSAStartup(), ");
  133.     rc = WSAStartup(MAKEWORD(1,1), &wsdata);
  134.     if (verbose)
  135.         printf("return = 0x%X, (%d)n", rc, rc);
  136.     if (rc) {
  137.         printf("WSAStartup failed: error code = %dn", rc);
  138.         return 1;
  139.     }
  140.     /*
  141.     *   Open a STREAM socket with SPX
  142.     */
  143.     if (verbose)
  144.         printf("calling socket(addresss family = %d, socket type = %d, protocol = %d)n", Local_Address_Family, Socket_Type, Protocol);
  145.     s = socket(Local_Address_Family, Socket_Type, Protocol);
  146.     if (verbose)
  147.         printf("socket() returned 0x%X (%d)n", s, s);
  148.     if (s == INVALID_SOCKET) {
  149.         printf("Socket call failedn");
  150.         exit(1);
  151.     }
  152.     /*
  153.     *   Bind to a socket.  We want to bind to a well known
  154.     *   socket so that who ever calls us will be able to.
  155.     */
  156. ISO_SET_TP_ADDR(&addr, &LocalTsel, sizeof(LocalTsel),
  157.                         LocalNetworkAddress, LocalNetworkAddressLength);
  158. /*
  159.     addr.sa_family = Local_Address_Family;
  160.     addr.addr_type = HIERARCHICAL;
  161.     addr.taddr_len = LocalNetworkAddressLength + LocalTselLength;
  162.     addr.tsel_len = LocalTselLength;
  163.     memcpy(&addr.addr, LocalTsel, LocalTselLength);
  164.     memcpy(&addr.addr[LocalTselLength],
  165.                 LocalNetworkAddress, LocalNetworkAddressLength);
  166. */
  167.     if (verbose) {
  168.         printf("calling bind(socket = %d): n  ", s);
  169.     }
  170.     rc = bind(s, (const struct sockaddr *) &addr, sizeof(SOCKADDR_TP));
  171.     if (verbose)
  172.         printf("bind() returned 0x%X (%d)n", rc, rc);
  173.     if (rc == SOCKET_ERROR) {
  174.         printf("Error binding to socketn");
  175.         closesocket(s);
  176.         return 1;
  177.     }
  178.     if (verbose)
  179.         printf("calling getsockname(socket = %d), ", s);
  180.     /*
  181.     *   Get the address we bound to and print it out
  182.     */
  183.     addrlen = sizeof(SOCKADDR_TP);
  184.     rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen);
  185.     if (verbose)
  186.         printf("return = 0x%X (%d)n", rc, rc);
  187.     if (rc == SOCKET_ERROR) {
  188.         printf("Error getting socket name");
  189.         closesocket(s);
  190.         return 1;
  191.     }
  192.     /*
  193.      *   Print out the network address
  194.      */
  195.     if (verbose) {
  196.         adr = (char *)&baddr;
  197.         printf("len(%d) addr : ", addrlen);
  198.         for ( i = 0; i < addrlen; i++)
  199.                 printf(" %x ", *(adr + i));
  200.     }
  201.     *skt = s;
  202.     return 0;
  203. }
  204. /****************************************************************************
  205. *
  206. *    FUNCTION:  do_listen( SOCKET s )
  207. *
  208. *    PURPOSE:   Sets the socket up for listening.
  209. *
  210. *    ARGUMENTS: SOCKET socket to listen on
  211. *
  212. *        RETURNS:   0 if ok
  213. *                               1 if error
  214. *
  215. ****************************************************************************/
  216. int do_listen(SOCKET s)
  217. {
  218.     int rc;
  219.     /*
  220.     *   Enable this socket as a listen socket that can
  221.     *   take <Backlog> connection indication(s) at a time.
  222.     */
  223.     if (verbose)
  224.         printf("calling listen(socket = %d, backlog = %d), ", s, Backlog);
  225.     rc = listen(s, Backlog);
  226.     if (verbose)
  227.         printf("return = 0x%X (%d)n", rc, rc);
  228.     if (rc == SOCKET_ERROR) {
  229.         printf("listen call failed");
  230.         closesocket(s);
  231.         return 1;
  232.     }
  233.     /*
  234.     *   Wait for a connection and get the connecting socket
  235.     */
  236.     return 0;
  237. }
  238. /****************************************************************************
  239. *
  240. *    FUNCTION:  wait_for_connection( SOCKET s, SOCKET *callsock )
  241. *
  242. *    PURPOSE:   Waits for someone to connect.
  243. *
  244. *    ARGUMENTS: SOCKET socket we are listening on
  245. *                               SOCKET * => area to store client socket info after
  246. *                                           connect
  247. *
  248. *        RETURNS:   0 if ok
  249. *                               1 if error
  250. *
  251. ****************************************************************************/
  252. int wait_for_connection(SOCKET s, SOCKET *callsock)
  253. {
  254.     SOCKET s2;
  255.     int addrlen = sizeof(SOCKADDR_TP);
  256.     /*
  257.     *   Go wait for somebody to connect
  258.     */
  259.     if (verbose)
  260.         printf("calling accept(socket = %d), ", s);
  261.     else
  262.         printf("Waiting for call...n");
  263.     s2 = accept(s, (struct sockaddr *) &saddr, &addrlen);
  264.     if (verbose)
  265.         printf("return (socket) = 0x%X (%d)n", s2, s2);
  266.     if (s2 == INVALID_SOCKET) {
  267.         printf("accept call failed");
  268.         closesocket(s);
  269.         return 1;
  270.     }
  271.     /*
  272.     *   Print out who connected to us
  273.     if (verbose) {
  274.         printf("addrlen = %dn", addrlen);
  275.         print_netaddr(saddr.sa_netnum, "Callers address = ", "n");
  276.     }
  277.     */
  278.     *callsock = s2;
  279.     return 0;
  280. }
  281. /****************************************************************************
  282. *
  283. *    FUNCTION:  do_recv_send( SOCKET s2 )
  284. *
  285. *    PURPOSE:   Waits for someone to connect.
  286. *
  287. *    ARGUMENTS: SOCKET socket to transmit on
  288. *
  289. *        RETURNS:   0 if ok
  290. *                               1 if error
  291. *
  292. ****************************************************************************/
  293. int do_recv_send(SOCKET s2)
  294. {
  295.     int rc, rcount = 0;
  296.     int nbytes, errflag = 0;
  297.     LPSTR recvbuf;
  298.     if (verbose)
  299.         printf("allocating %d bytes for receive buffern", Receive_Length);
  300.     recvbuf = malloc(Receive_Length);
  301.     if (!recvbuf) {
  302.         printf("Error allocating %d bytes for receive buffern", Receive_Length);
  303.         return 1;
  304.     }
  305.     /*
  306.     *   Recv packets and send them back
  307.     */
  308.     while (1) {
  309.         /*
  310.         *   Receive data
  311.         */
  312.         if (verbose)
  313.             printf("calling recv(socket = %d, receive length = %d)n", s2, Receive_Length);
  314.         Sleep(Sleep_Time);
  315.         nbytes = recv(s2, recvbuf, Receive_Length, 0);
  316.         if (nbytes == SOCKET_ERROR) {
  317.             printf("recv call failed");
  318.             errflag++;
  319.             break;
  320.         }
  321.         if (verbose)
  322.             printf("Received packet %d: received %d bytesn", rcount++, nbytes);
  323.         else
  324.             printf("rReceived packet %d: received %d bytes... ", rcount++, nbytes);
  325.         /*
  326.         *   Send the data back
  327.         */
  328. /*
  329.         if (verbose)
  330.             printf("calling send(socket = %d, send length = %d)n", s2, nbytes);
  331.         rc = send(s2, recvbuf, nbytes, 0);
  332.         if (rc == SOCKET_ERROR) {
  333.             printf("send call failedn");
  334.             errflag++;
  335.             break;
  336.         }
  337.         printf("Sent %d bytes", rc);
  338. */
  339.         if (verbose)
  340.             printf("n");
  341.         if (No_Loop)
  342.             break;
  343.     }
  344.     if (verbose)
  345.         printf("freeing receive buffern");
  346.     free(recvbuf);
  347.     return errflag;
  348. }