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

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright 1996-1997 Microsoft Corporation
  3. Module Name:
  4.     comm.c
  5. Abstract:
  6.     Implements a set of common operations for socket communication
  7. Revision History:
  8. --*/
  9. #include <windows.h>
  10. #include <winsock.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include "comm.h"
  14. BOOL InitWinsock ()
  15. {
  16. int nRes;
  17. WSADATA wsaData;
  18. WORD wVerRequested = 0x0101; // ver 1.1
  19. // Init the sockets interface
  20. nRes = WSAStartup (wVerRequested, &wsaData);
  21. if (nRes)  {
  22. fprintf (stderr, "Couldn't init winsock: %dn", nRes);
  23. return(FALSE);
  24. }
  25. return(TRUE);
  26. }
  27. BOOL TermWinsock ()
  28. {
  29. if (SOCKET_ERROR == WSACleanup ())
  30. return(FALSE);
  31. else
  32. return(TRUE);
  33. }
  34. BOOL SendMsg (SOCKET s, PBYTE pBuf, DWORD cbBuf)
  35. /*++
  36.  Routine Description:
  37.     Sends a message over the socket by first sending a DWORD that
  38. represents the size of the message followed by the message itself.
  39.  Return Value:
  40.     Returns TRUE is successful; otherwise FALSE is returned.
  41. --*/
  42. {
  43. if (0 == cbBuf)
  44. return(TRUE);
  45. // send the size of the message
  46. //
  47. if (!SendBytes (s, (PBYTE)&cbBuf, sizeof (cbBuf)))
  48. return(FALSE);
  49. // send the body of the message
  50. //
  51. if (!SendBytes (s, pBuf, cbBuf))
  52. return(FALSE);
  53. return(TRUE);
  54. }
  55. BOOL ReceiveMsg (SOCKET s, PBYTE pBuf, DWORD cbBuf, DWORD *pcbRead)
  56. /*++
  57.  Routine Description:
  58.     Receives a message over the socket.  The first DWORD in the message
  59. will be the message size.  The remainder of the bytes will be the
  60. actual message.
  61.  Return Value:
  62.     Returns TRUE is successful; otherwise FALSE is returned.
  63. --*/
  64. {
  65. DWORD cbRead;
  66. DWORD cbData;
  67. // find out how much data is in the message
  68. //
  69. if (!ReceiveBytes (s, (PBYTE)&cbData, sizeof (cbData), &cbRead))
  70. return(FALSE);
  71. if (sizeof (cbData) != cbRead)
  72. return(FALSE);
  73. // Read the full message
  74. //
  75. if (!ReceiveBytes (s, pBuf, cbData, &cbRead))
  76. return(FALSE);
  77. if (cbRead != cbData)
  78. return(FALSE);
  79. *pcbRead = cbRead;
  80. return(TRUE);
  81. }
  82. BOOL SendBytes (SOCKET s, PBYTE pBuf, DWORD cbBuf)
  83. {
  84. PBYTE pTemp = pBuf;
  85. int cbSent, cbRemaining = cbBuf;
  86. if (0 == cbBuf)
  87. return(TRUE);
  88. while (cbRemaining) {
  89. cbSent = send (s, pTemp, cbRemaining, 0);
  90. if (SOCKET_ERROR == cbSent) {
  91. fprintf (stderr, "send failed: %un", GetLastError ());
  92. return FALSE;
  93. }
  94. pTemp += cbSent;
  95. cbRemaining -= cbSent;
  96. }
  97. return TRUE;
  98. }
  99. BOOL ReceiveBytes (SOCKET s, PBYTE pBuf, DWORD cbBuf, DWORD *pcbRead)
  100. {
  101. PBYTE pTemp = pBuf;
  102. int cbRead, cbRemaining = cbBuf;
  103. while (cbRemaining) {
  104. cbRead = recv (s, pTemp, cbRemaining, 0);
  105. if (0 == cbRead)
  106. break;
  107. if (SOCKET_ERROR == cbRead) {
  108. fprintf (stderr, "recv failed: %un", GetLastError ());
  109. return FALSE;
  110. }
  111. cbRemaining -= cbRead;
  112. pTemp += cbRead;
  113. }
  114. *pcbRead = cbBuf - cbRemaining;
  115. return TRUE;
  116. }