📄 subject_27801.htm
字号:
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:在水一方 回复日期:2003-01-15 15:21:28
<br>内容:以下是一个Socket程序的Server端,其主体部分(就是可以单独成为一个Console程序的那一部分)是<BR>函数StartHotKeyService。其实一个NT服务程序除了主体部分以外,其余的大部分都有固定的格式。本示例共两个文件,慢慢看:<BR><BR>// greet.h<BR><BR>#if !defined(NO_GUI_STDAFX_H_)<BR><BR> #define NO_GUI_STDAFX_H_<BR> #define _WIN32_WINNT 0x0500<BR><BR> #if _MSC_VER > 1000<BR> #pragma once<BR> #endif // _MSC_VER > 1000<BR><BR> #define WIN32_LEAN_AND_MEAN <BR> #define HOTKEYSERVICE "HotKeyService"<BR> #define ID_MYHOTKEY (WM_APP + 1)<BR><BR> #include <stdio.h><BR> #include <stdlib.h><BR> #include <string.h><BR> #include <iostream.h><BR> #include <windows.h><BR> #include <winsock2.h><BR><BR> #pragma comment(lib, "wsock32")<BR><BR> void WINAPI HotKeyServiceMain(DWORD dwArgc,LPTSTR *lpszArgv);<BR> void WINAPI HotkeyHandler(DWORD dwControlId);<BR><BR> DWORD WINAPI ContactWithClient(LPVOID);<BR> void SendError(LPCSTR ErrInfo, SOCKET *lpSock = NULL);<BR> void SendError(long lErrCode, SOCKET *lpSock = NULL);<BR> BOOL StartHotKeyService();<BR> void StopHotKeyService();<BR> void DisplayInfo();<BR> void ReportError(DWORD);<BR> void ReportError(LPCSTR pInfo);<BR> void ReportStatusToSCMgr( DWORD dwCurrentState, <BR> DWORD dwControlsAccepted = 0, <BR> DWORD dwWaitHint = 0,<BR> DWORD dwServiceSpecificExitCode = 0);<BR><BR>#endif <BR><BR><BR><BR>// greet.cpp<BR><BR>// NoGUI.cpp : Defines the entry point for the application.<BR><BR>#include "greet.h"<BR><BR>BOOL CanContinue = TRUE;<BR>CRITICAL_SECTION CriticalObject;<BR><BR>typedef struct _tagSession<BR>{<BR> int iSerial;<BR> DWORD dwThreadId;<BR> SOCKET sock;<BR> sockaddr_in addr;<BR>}SESSION, *LPSESSION;<BR><BR>DWORD dwThreadId;<BR>SERVICE_STATUS servStatus;<BR>SERVICE_STATUS_HANDLE hStatusHandle;<BR><BR><BR>int main()<BR>{<BR><BR> SERVICE_TABLE_ENTRY szServiceTable[] = { \<BR> {HOTKEYSERVICE, HotKeyServiceMain}, \<BR> {NULL, NULL} \<BR> };<BR><BR> InitializeCriticalSection(&CriticalObject);<BR> <BR> if ( !StartServiceCtrlDispatcher(szServiceTable) )<BR> ReportError(GetLastError());<BR><BR> return 0;<BR>}<BR><BR>void WINAPI HotKeyServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)<BR>{<BR> hStatusHandle = RegisterServiceCtrlHandler(HOTKEYSERVICE, HotkeyHandler);<BR> if (!hStatusHandle)<BR> {<BR> ReportStatusToSCMgr(SERVICE_STOPPED, 0, 0, GetLastError());<BR> return;<BR> }<BR> if (!StartHotKeyService())<BR> ReportStatusToSCMgr(SERVICE_STOPPED, 0, 0, GetLastError());<BR>}<BR><BR>void WINAPI HotkeyHandler(DWORD dwControlId)<BR>{<BR> switch (dwControlId)<BR> {<BR> case SERVICE_CONTROL_STOP :<BR> ReportStatusToSCMgr(SERVICE_STOP_PENDING);<BR> StopHotKeyService();<BR> ReportStatusToSCMgr(SERVICE_STOPPED);<BR> break;<BR><BR> case SERVICE_CONTROL_INTERROGATE :<BR> ReportStatusToSCMgr(servStatus.dwCurrentState, servStatus.dwControlsAccepted);<BR> break;<BR><BR> default :<BR> ReportStatusToSCMgr(servStatus.dwCurrentState, servStatus.dwControlsAccepted);<BR> break;<BR> }<BR>}<BR><BR>BOOL StartHotKeyService()<BR>{<BR><BR> int iClientCount = 0;<BR> WSADATA wsaData;<BR> SOCKET ServerSock, ClientSock;<BR> sockaddr_in ServerAddr, ClientAddr;<BR><BR> ReportStatusToSCMgr(SERVICE_START_PENDING, 0, 1);<BR><BR> if ( WSAStartup(MAKEWORD(1, 1), &wsaData) != 0 )<BR> SendError("Can\'t get Socket Version 1.1");<BR> <BR> ServerAddr.sin_family = AF_INET;<BR> ServerAddr.sin_port = htons(4000);<BR> ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);<BR> ServerSock = socket(AF_INET, SOCK_STREAM, 0);<BR><BR> if ( bind(ServerSock, (LPSOCKADDR)&ServerAddr, sizeof(ServerAddr)) != 0 )<BR> SendError("Fail to bind socket", &ServerSock);<BR> if ( listen(ServerSock, 10) != 0 )<BR> SendError("Fail to listen", &ServerSock);<BR> <BR> ReportError("Session Server begin...");<BR> ReportStatusToSCMgr(SERVICE_RUNNING, SERVICE_ACCEPT_STOP);<BR><BR> while (1)<BR> {<BR> EnterCriticalSection(&CriticalObject);<BR> if (!CanContinue)<BR> break;<BR> LeaveCriticalSection(&CriticalObject);<BR><BR> ClientSock = accept(ServerSock, (LPSOCKADDR)&(ClientAddr), NULL);<BR> if ( ClientSock != INVALID_SOCKET )<BR> {<BR> iClientCount++;<BR> LPSESSION lpSession = (LPSESSION)new SESSION;<BR> lpSession->addr = ClientAddr;<BR> lpSession->sock = ClientSock;<BR> lpSession->iSerial = iClientCount;<BR> CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ContactWithClient, lpSession, 0, &lpSession->dwThreadId);<BR> }<BR> else<BR> SendError(WSAGetLastError(), &ServerSock);<BR> }<BR><BR> closesocket(ServerSock);<BR> WSACleanup();<BR> <BR> return TRUE;<BR>}<BR><BR>void StopHotKeyService()<BR>{<BR> EnterCriticalSection(&CriticalObject);<BR> CanContinue = FALSE;<BR> LeaveCriticalSection(&CriticalObject);<BR>}<BR><BR>void ReportStatusToSCMgr( DWORD dwCurrentState, <BR> DWORD dwControlsAccepted , <BR> DWORD dwWaitHint,<BR> DWORD dwServiceSpecificExitCode )<BR>{<BR> servStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;<BR> servStatus.dwCheckPoint = 0;<BR> servStatus.dwCurrentState = dwCurrentState;<BR> servStatus.dwWaitHint = dwWaitHint;<BR> servStatus.dwControlsAccepted = dwControlsAccepted;<BR> servStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;<BR> if (dwServiceSpecificExitCode == 0)<BR> servStatus.dwWin32ExitCode = NO_ERROR;<BR> else<BR> servStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;<BR> if ( !SetServiceStatus(hStatusHandle, &servStatus) )<BR> {<BR> ReportError(GetLastError());<BR> exit(0);<BR> }<BR>}<BR><BR>DWORD WINAPI ContactWithClient(LPVOID pParam)<BR>{<BR> int i;<BR> char szInfo[255], buf[255];<BR> LPSESSION lpSession = (LPSESSION)pParam;<BR> static char *command[] = {"QUIT", "?", "HELP", "ABOUT", "How are you", "What\'s your name"};<BR> static char *info[] = { "QUIT", \<BR> "HELP ABOUT QUIT GREET", \<BR> "HELP ABOUT QUIT GREET", \<BR> "Server C Version, Author: Supin Zan", \<BR> "Fine, thank you! And you?", \<BR> "Supin Zan"<BR> };<BR><BR> sprintf(szInfo, "Recevie the request of the %dth client", lpSession->iSerial);<BR> ReportError(szInfo);<BR> while ( recv(lpSession->sock, buf, 255, 0) > 0 )<BR> {<BR> sprintf(szInfo, "--client %d : %s", lpSession->iSerial, buf);<BR> MessageBox(NULL, szInfo, "greet", MB_ICONINFORMATION | MB_OK | MB_SERVICE_NOTIFICATION);<BR> ReportError(szInfo);<BR> for (i = 0; i < sizeof(command) / sizeof(command[0]); i++)<BR> if ( _stricmp(command[i], buf) == 0 )<BR> {<BR> if ( i == 0 )<BR> goto end;<BR> strcpy(buf, info[i]);<BR> break;<BR> }<BR> if ( i >= sizeof(command) / sizeof(command[0]) )<BR> strcpy(buf, "Not Implemented");<BR> send(lpSession->sock, buf, strlen(buf) + 1, 0);<BR> memset(buf, 0, 255);<BR> }<BR><BR>end:<BR> closesocket(lpSession->sock);<BR> sprintf(szInfo, "Stop talking with the %dth client", lpSession->iSerial);<BR> ReportError(szInfo);<BR> delete lpSession;<BR> return 0;<BR><BR>}<BR><BR>void ReportError(DWORD dwErrorId)<BR>{<BR> char szErrorInfo[255];<BR> FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, <BR> NULL,<BR> dwErrorId,<BR> MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),<BR> szErrorInfo,<BR> 255,<BR> NULL );<BR> FILE *file = fopen("D:\\HotKeyService.log", "a");<BR> fprintf(file, "%s\n", szErrorInfo);<BR> fclose(file);<BR>}<BR><BR>void ReportError(LPCSTR pInfo)<BR>{<BR> FILE *file = fopen("D:\\HotKeyService.log", "a+");<BR> fseek(file, 0L, SEEK_END);<BR> fprintf(file, "%s\n", pInfo);<BR> fclose(file);<BR>}<BR><BR>void SendError(long lErrCode, SOCKET *lpSock)<BR>{<BR> char info[255];<BR> sprintf(info, "Error Code: %d", lErrCode);<BR> ReportError(info);<BR> if (lpSock != NULL)<BR> closesocket(*lpSock);<BR> WSACleanup();<BR> exit(0);<BR>}<BR><BR>void SendError(LPCSTR ErrInfo, SOCKET *lpSock)<BR>{<BR> ReportError(ErrInfo);<BR> if (lpSock != NULL)<BR> closesocket(*lpSock);<BR> WSACleanup();<BR> exit(0);<BR>}<BR><BR><BR><BR>2003-1-15 15:29:45
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -