自己写的2个windows服务程序用socket进行通信,但是有错
服务端
[code=C/C++][#include <windows.h>
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib, "Wsock32.lib ")
#include <string.h>
#define PORT 27015
#define SLEEP_TIME 5000//两次连续查询之间的的毫秒间隔
#define LOGFILE "D:\\memstatus1.txt"
////////////////////////////////////////////////////////////
// Declare several global variables to share
// their values across multiple functions of your program.
////////////////////////////////////////////////////////////
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
STARTUPINFO si,si1;
PROCESS_INFORMATION pi,pi1;//进程信息
TCHAR *Sexe;//存储可执行文件路径
TCHAR *Sexe1;
SOCKET sockfd;
struct sockaddr_in seraddr;
struct sockaddr_in cliaddr;
char buffer[5]="ok";
void WriteToLog(char* str)
{
FILE* log;
log = fopen(LOGFILE, "a+");
if (log == NULL){
OutputDebugString("Log file open failed.");
return ;
}
//strcat(str," Creat Error");
fprintf(log, "%s\n", str);
fclose(log);
return ;
}
int process_run(TCHAR *Sexe,STARTUPINFO &ssi,PROCESS_INFORMATION &ppi)
{
if (!CreateProcess(Sexe,NULL,NULL,NULL,FALSE,0,NULL,NULL,&ssi,&ppi))
{
WriteToLog(Sexe);
return 1;
}
return 0;
}
void udp_server()
{
WSADATA ws;//存放windows socket初始化信息
int ret=WSAStartup(MAKEWORD(2,2),&ws);//初始化windows Socket 2.2
if (ret!= 0)
{
WriteToLog("Init Windows Socket Failed!\n");
return ;
}
WriteToLog("服务器开始创建SOCKET\n");
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(PORT);//监听端口
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);//
//memset(&(seraddr.sin_zero),0,8);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd == INVALID_SOCKET)
{
WriteToLog("Socket Create Failed!\n");
return ;
}
ret = bind(sockfd,(struct sockaddr*)&seraddr,sizeof(seraddr));
if (ret == -1)
{
WriteToLog("Socket Bind Failed!\n");
closesocket(sockfd);
return ;
}
}
// Service initialization
int InitService()
{
udp_server();//创建socket
int result1,result2;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi,sizeof (pi));
ZeroMemory(&si1,sizeof(si1));
si.cb = sizeof(si1);
ZeroMemory(&pi1,sizeof (pi1));
Sexe=TEXT("C:\\Program Files\\kuwo\\KWMUSIC\\bin\\KwMusic.exe");
//Sexe=TEXT("C:\\Program Files\\Qt\\w1\\debug\\w1.exe");
Sexe1=TEXT("C:\\Program Files\\duowan\\yy-4\\YY.exe");
result1=process_run(Sexe,si,pi);
result2=process_run(Sexe1,si1,pi1);
return result1||result2;
//return result1;
}
// Control Handler
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
OutputDebugString("Monitoring stopped.");
WriteToLog("Monitoring stopped.");
if(sendto(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&cliaddr,sizeof(cliaddr))==SOCKET_ERROR) //如果关机发送信号给备机
{
WriteToLog("发送失败");
FILE* log;
log = fopen(LOGFILE, "a+");
//strcat(str," Creat Error");
fprintf(log, "%d\n", WSAGetLastError());
fclose(log);
}
//closesocket(sockfd);
TerminateProcess( pi.hProcess, 0);//关闭开启的进程
TerminateProcess( pi1.hProcess, 0);
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
OutputDebugString("Monitoring stopped.");
WriteToLog("Monitoring stopped.");
if(sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&cliaddr,sizeof(struct sockaddr))==SOCKET_ERROR) //如果关机发送信号给备机
{
WriteToLog("发送失败");
}
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
default:
break;
}
// Report current status
SetServiceStatus (hStatus, &ServiceStatus);
return;
}
void ServiceMain(int argc, char** argv)
{
int error;
int result=0;
ServiceStatus.dwServiceType =
SERVICE_WIN32;
//SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState =
SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted =
SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
hStatus = RegisterServiceCtrlHandler(
"TestService",
(LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
return;
}
// Initialize Service
error = InitService(); //初始化
if (error!=0)
{
// Initialization failed
ServiceStatus.dwCurrentState =
SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus, &ServiceStatus);
return;
}
// We report the running status to SCM.
ServiceStatus.dwCurrentState =
SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);
// The worker loop of a service
while (ServiceStatus.dwCurrentState ==
SERVICE_RUNNING)
{
DWORD dw1=WaitForSingleObject(pi.hProcess,0);//检测进程是否停止
if (dw1==WAIT_OBJECT_0)
{
result=process_run(Sexe,si,pi);
if (result!=0)
{
ServiceStatus.dwCurrentState =
SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus,
&ServiceStatus);
return;
}
}
DWORD dw2=WaitForSingleObject(pi1.hProcess,0);//检测进程是否停止
if (dw2==WAIT_OBJECT_0)
{
result=process_run(Sexe1,si1,pi1);
if (result!=0)//如果创建失败
{
ServiceStatus.dwCurrentState =
SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus,
&ServiceStatus);
return;
}
}
Sleep(SLEEP_TIME);
}
//TerminateProcess( pi.hProcess, 0);
//TerminateProcess( pi1.hProcess, 0);
return;
}
void main(int argc, char* argv[])
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "TestService";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// Start the control dispatcher thread for our service
StartServiceCtrlDispatcher(ServiceTable);
}
/code]
[解决办法]
客户端
[code=C/C++][#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#pragma comment(lib, "Wsock32.lib ")
#define PORT 27015
#define ID_NUM "192.168.1.124"
#define SLEEP_TIME 5000//两次连续查询之间的的毫秒间隔
#define LOGFILE "D:\\memstatus2.txt"
////////////////////////////////////////////////////////////
// Declare several global variables to share
// their values across multiple functions of your program.
////////////////////////////////////////////////////////////
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
STARTUPINFO si,si1;
PROCESS_INFORMATION pi,pi1;//进程信息
TCHAR *Sexe;//存储可执行文件路径
TCHAR *Sexe1;
SOCKET sockfd;
struct sockaddr_in seraddr;
//struct sockaddr_in cliaddr;
char buffer[5]="\0";
void WriteToLog(char* str)
{
FILE* log;
log = fopen(LOGFILE, "a+");
if (log == NULL){
OutputDebugString("Log file open failed.");
return ;
}
//strcat(str," Creat Error");
fprintf(log, "%s\n", str);
fclose(log);
return ;
}
int process_run(TCHAR *Sexe,STARTUPINFO &ssi,PROCESS_INFORMATION &ppi)
{
if (!CreateProcess(Sexe,NULL,NULL,NULL,FALSE,0,NULL,NULL,&ssi,&ppi))
{
WriteToLog(Sexe);
return 1;
}
return 0;
}
void udp_client()
{
WSADATA ws;//存放windows socket初始化信息
int ret=WSAStartup(MAKEWORD(2,2),&ws);//初始化windows Socket 2.2
if (ret!= 0)
{
WriteToLog("Init Windows Socket Failed!\n");
return ;
}
WriteToLog("客户端开始创建SOCKET\n");
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(PORT);//监听端口
seraddr.sin_addr.s_addr = inet_addr(ID_NUM); ///server的地址
//memset(&(seraddr.sin_zero),0,8);
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd == INVALID_SOCKET)
{
WriteToLog("Socket Create Failed!\n");
return ;
}
int fromlen=sizeof(struct sockaddr);
if(recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&seraddr,&fromlen)==-1)
{
perror("recvfrom");
WriteToLog( strerror(errno));
FILE* log;
log = fopen(LOGFILE, "a+");
//strcat(str," Creat Error");
fprintf(log, "%d\n", WSAGetLastError());
fclose(log);
}
if(strcmp(buffer,"ok")==0)
{
WriteToLog("客户端接收成功");
}
}
// Service initialization
int InitService()
{
udp_client();//创建socket
int result1,result2;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi,sizeof (pi));
ZeroMemory(&si1,sizeof(si1));
si.cb = sizeof(si1);
ZeroMemory(&pi1,sizeof (pi1));
//Sexe=TEXT("C:\\Program Files (x86)\\KuGou2012\\KuGou.exe");
//Sexe=TEXT("C:\\Program Files\\kuwo\\KWMUSIC\\bin\\KwMusic.exe");
Sexe=TEXT("C:\\Program Files\\duowan\\yy-4\\YY.exe");
//Sexe=TEXT("D:\\myself\\QT_project\\W1\\debug\\W1.exe");
//Sexe1=TEXT("D:\\影音娱乐\\QQ\Bin\\QQ.exe");
Sexe1=TEXT("C:\\Program Files\\duowan\\yy-4\\YY.exe");
result1=process_run(Sexe,si,pi);
result2=process_run(Sexe1,si1,pi1);
return result1
[解决办法]
result2;
//return result1;
}
// Control Handler
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
OutputDebugString("Monitoring stopped.");
WriteToLog("Monitoring stopped.");
closesocket(sockfd);
TerminateProcess( pi.hProcess, 0);//关闭开启的进程
TerminateProcess( pi1.hProcess, 0);
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN:
OutputDebugString("Monitoring stopped.");
WriteToLog("Monitoring stopped.");
closesocket(sockfd);
//if(sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&cliaddr,sizeof(struct sockaddr))!=SOCKET_ERROR) //如果关机发送信号给备机
//{
//WriteToLog("发送失败");
//}
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
default:
break;
}
// Report current status
SetServiceStatus (hStatus, &ServiceStatus);
return;
}
void ServiceMain(int argc, char** argv)
{
int error;
int result=0;
ServiceStatus.dwServiceType =
SERVICE_WIN32;
//SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState =
SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted =
SERVICE_ACCEPT_STOP