首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

自个儿写的2个windows服务程序用socket进行通信,但是有错

2012-12-20 
自己写的2个windows服务程序用socket进行通信,但是有错服务端[codeC/C++][#include windows.h#include

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

热点排行