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

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright 1996-1997 Microsoft Corporation
  3. Module Name:
  4.     server.c
  5. Abstract:
  6.     A command line app that establishes an authenticated connection
  7. with a client.
  8. Revision History:
  9. --*/
  10. #include <windows.h>
  11. #include <winsock.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include "security.h"
  15. #include "comm.h"
  16. BOOL AcceptAuthSocket (SOCKET *s);
  17. BOOL CloseAuthSocket (SOCKET s);
  18. BOOL DoAuthentication (SOCKET s);
  19. static PBYTE g_pInBuf = NULL;
  20. static PBYTE g_pOutBuf = NULL;
  21. static DWORD g_cbMaxMessage = 0;
  22. static unsigned short g_usPort = 2000;
  23. void main ()
  24. {
  25. char szUser[80];
  26. DWORD cbUser = 80;
  27. SOCKET s;
  28. // initialize
  29. //
  30. if (!InitWinsock ())
  31. exit (EXIT_FAILURE);
  32. if (!InitPackage (&g_cbMaxMessage))
  33. exit (EXIT_FAILURE);
  34. g_pInBuf = (PBYTE) malloc (g_cbMaxMessage);
  35. g_pOutBuf = (PBYTE) malloc (g_cbMaxMessage);
  36. if (NULL == g_pInBuf || NULL == g_pOutBuf)
  37. exit (EXIT_FAILURE);
  38. // Make an authenticated connection with client
  39. //
  40. if (!AcceptAuthSocket (&s))
  41. exit (EXIT_FAILURE);
  42. // impersonate the client
  43. //
  44. if (!ImpersonateContext (s))
  45. exit (EXIT_FAILURE);
  46. // get the user name
  47. //
  48. if (!GetUserName (szUser, &cbUser))
  49. exit (EXIT_FAILURE);
  50. // revert to self
  51. //
  52. if (!RevertContext (s))
  53. exit (EXIT_FAILURE);
  54. // send user name to client
  55. //
  56. if (!SendBytes (s, szUser, cbUser))
  57. exit (EXIT_FAILURE);
  58. // terminate and cleanup
  59. //
  60. CloseAuthSocket (s);
  61. TermPackage ();
  62. TermWinsock ();
  63. free (g_pInBuf);
  64. free (g_pOutBuf);
  65. exit (EXIT_SUCCESS);
  66. }
  67. BOOL AcceptAuthSocket (SOCKET *s)
  68. /*++
  69.  Routine Description:
  70.     Establishes an authenticated socket connection with a client and
  71. initializes any needed security package resources.
  72.  Return Value:
  73.     Returns TRUE is successful; otherwise FALSE is returned.
  74. --*/
  75. {
  76. SOCKET sockListen;
  77. SOCKET sockClient;
  78. SOCKADDR_IN sin;
  79. int nRes;
  80. // create listening socket
  81. //
  82. sockListen = socket (PF_INET, SOCK_STREAM, 0);
  83. if (INVALID_SOCKET == sockListen)  {
  84. fprintf (stderr, "Failed to create socket: %un", GetLastError ());
  85. return(FALSE);
  86. }
  87. // bind to local port
  88. //
  89. sin.sin_family = AF_INET;
  90. sin.sin_addr.s_addr = 0;
  91.     sin.sin_port = htons(g_usPort);
  92. nRes = bind (sockListen, (LPSOCKADDR) &sin, sizeof (sin));
  93. if (SOCKET_ERROR == nRes)  {
  94. fprintf (stderr, "bind failed: %un", GetLastError ());
  95. return(FALSE);
  96. }
  97. // listen for client
  98. //
  99. nRes = listen (sockListen, 1);
  100. if (SOCKET_ERROR == nRes)  {
  101. fprintf (stderr, "listen failed: %un", GetLastError ());
  102. return(FALSE);
  103. }
  104. // accept client
  105. //
  106. sockClient = accept (sockListen, NULL, NULL);
  107. if (INVALID_SOCKET == sockClient)  {
  108. fprintf (stderr, "accept failed: %un", GetLastError ());
  109. return(FALSE);
  110. }
  111. closesocket (sockListen);
  112. if (!InitSession (sockClient))
  113. return(FALSE);
  114. if (!DoAuthentication (sockClient))
  115. return(FALSE);
  116. // return socket
  117. //
  118. *s = sockClient;
  119. return(TRUE);
  120. }
  121. BOOL CloseAuthSocket (SOCKET s)
  122. /*++
  123.  Routine Description:
  124.     Closes a socket and releases security resources associated with
  125. the socket
  126.  Return Value:
  127.     Returns TRUE is successful; otherwise FALSE is returned.
  128. --*/
  129. {
  130. TermSession (s);
  131. shutdown (s, 2);
  132. closesocket (s);
  133. return(TRUE);
  134. }
  135. BOOL DoAuthentication (SOCKET s)
  136. /*++
  137.  Routine Description:
  138.     Manges the authentication conversation with the client via the
  139.     supplied socket handle.
  140.  Return Value:
  141.     Returns TRUE is successful; otherwise FALSE is returned.
  142. --*/
  143. {
  144. DWORD cbIn, cbOut;
  145. BOOL done = FALSE;
  146. do {
  147. if (!ReceiveMsg (s, g_pInBuf, g_cbMaxMessage, &cbIn))
  148. return(FALSE);
  149. cbOut = g_cbMaxMessage;
  150. if (!GenServerContext (s, g_pInBuf, cbIn, g_pOutBuf, &cbOut, &done))
  151. return(FALSE);
  152. if (!SendMsg (s, g_pOutBuf, cbOut))
  153. return(FALSE);
  154. }
  155. while(!done);
  156. return(TRUE);
  157. }