读书人

自个儿写的2个windows服务程序用socke

发布时间: 2012-12-20 09:53:21 作者: rapoo

自己写的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

读书人网 >VC

热点推荐