18,356
社区成员
发帖
与我相关
我的任务
分享
VOID WINAPI __ServiceMain(DWORD dwArgc,LPTSTR* lpszArgv)
{
DWORD InitResult,SpecificError;
m_ServiceStatusHandle = RegisterServiceCtrlHandler(m_ServiceName,(LPHANDLER_FUNCTION)___DONOTCALLTHISFUNCTION_ServiceCtrlHandler);
if (m_ServiceStatusHandle == NULL)
{
return;
}
//SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
// Initialization code goes here. 初始化是IOCP的例行过程
InitResult = myInitialization(dwArgc,lpszArgv, &m_ServiceStatus,SpecificError);
// Handle error condition
if (InitResult != NO_ERROR)
{
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatus.dwWin32ExitCode = InitResult;
m_ServiceStatus.dwServiceSpecificExitCode = SpecificError;
::SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus);
return;
}
// Initialization complete - report running status.
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
//if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus))
if(!::SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))return;
// This is where the service does its work.
myServiceMainThread();//这个函数就是我贴的第一个函数的全部内容.ACCEPT就是在这个函数里
return;
}
{
int ret;
_dwArgc;
_lpszArgv;
//设置PENDING状态
_pServiceStatus->dwServiceType = SERVICE_WIN32;
_pServiceStatus->dwCurrentState = SERVICE_START_PENDING;
_pServiceStatus->dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
_pServiceStatus->dwWin32ExitCode = 0;
_pServiceStatus->dwServiceSpecificExitCode = 0;
_pServiceStatus->dwCheckPoint = 1;
_pServiceStatus->dwWaitHint = 1000;
this->SetServiceStatus(_pServiceStatus);
m_hEventAccept = ::CreateEvent(0,TRUE,TRUE,NULL);
if(m_hEventAccept == NULL)
{
return GetLastError();
}
//Create socket
m_ServerSocket = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL,0,WSA_FLAG_OVERLAPPED);
if(m_ServerSocket == INVALID_SOCKET)
{
_SpecificError = WSAGetLastError();
if(WSANOTINITIALISED == _SpecificError)
{
WSADATA wsaData;
ZeroMemory(&wsaData,sizeof(WSADATA));
if(0 == (_SpecificError = WSAStartup(MAKEWORD(2,2), &wsaData)))
{
isWSAStartupByUs = TRUE;
}
else
{ return ERROR_SERVICE_SPECIFIC_ERROR;}
m_ServerSocket = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL,0,WSA_FLAG_OVERLAPPED);
}
else
{ return ERROR_SERVICE_SPECIFIC_ERROR;}
}
if( m_ServerSocket == INVALID_SOCKET )
{
_SpecificError = WSAGetLastError();
cout << "Server Socket Creation Failed::Reason Code::" << _SpecificError << endl;
return ERROR_SERVICE_SPECIFIC_ERROR;
}
//bind
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = m_BindAddress;//htonl(m_BindAddress);
service.sin_port = htons(m_ListenPort);//m_ListenPort
ret = bind(m_ServerSocket,(SOCKADDR *)&service,sizeof(service));
if( ret == SOCKET_ERROR )
{
closesocket(m_ServerSocket);
m_ServerSocket = NULL;
_SpecificError = WSAGetLastError();
cout << "Server Soket Bind Failed::Reason Code::"<< _SpecificError << endl;
return ERROR_SERVICE_SPECIFIC_ERROR;
}
//listen
ret = listen(m_ServerSocket, 0);
if( ret == SOCKET_ERROR )
{
closesocket(m_ServerSocket);
m_ServerSocket = NULL;
_SpecificError = WSAGetLastError();
cout << "Server Socket Listen Failed::Reason Code::"<< _SpecificError << endl;
return ERROR_SERVICE_SPECIFIC_ERROR;
}
// Create IOCP
SYSTEM_INFO sysInfo;
ZeroMemory(&sysInfo,sizeof(SYSTEM_INFO));
GetSystemInfo(&sysInfo);
m_ThreadCount = (WORD)sysInfo.dwNumberOfProcessors * 2;
m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,m_ThreadCount);
if (m_hIOCP == NULL)
{
closesocket(m_ServerSocket);
m_ServerSocket = NULL;
_SpecificError = GetLastError();
cout << "CreateIoCompletionPort() Failed::Reason::"<< _SpecificError << endl;
return _SpecificError;
}
if (CreateIoCompletionPort((HANDLE)m_ServerSocket,m_hIOCP,0,0) == NULL)
{
closesocket(m_ServerSocket);
m_ServerSocket = NULL;
CloseHandle(m_hIOCP);
m_hIOCP = NULL;
_SpecificError = GetLastError();
cout << "Binding Server Socket to IO Completion Port Failed::Reason Code::"<< _SpecificError << endl;
return _SpecificError;
}
//Create worker threads
ret = 0;
m_pWorkThread = new CIOCPThread*[m_ThreadCount];
for( WORD dwThread=0; dwThread < m_ThreadCount; dwThread++ )
{
m_pWorkThread[dwThread] = new CIOCPThread(m_hIOCP);
if(m_pWorkThread[dwThread]->Ctrl_turnon())
{
ret++;
}
else
{
delete m_pWorkThread[dwThread];
m_pWorkThread[dwThread] = NULL;
}
}
if(ret == 0)
{
closesocket(m_ServerSocket);
m_ServerSocket = NULL;
CloseHandle(m_hIOCP);
m_hIOCP = NULL;
cout << "Can't Create ANY Thread for work."<< endl;
return ERROR_TOO_MANY_TCBS;//无法创建线程
}
return ERROR_SUCCESS;
}
{
SOCKET ls ;
sockaddr_in client;
int addrlen = sizeof(sockaddr_in);
while(WAIT_OBJECT_0 == ::WaitForSingleObject(m_hEventAccept,(DWORD)(-1)))
{//m_hEventAccept是一个手动set,reset的事件
ls = accept( m_ServerSocket, (SOCKADDR *)&client, &addrlen );
//ls = WSAAccept( m_ServerSocket, (SOCKADDR *)&client, &addrlen );
if(ls == SOCKET_ERROR) break;
cout << "Client "<<inet_ntoa(client.sin_addr)<<":"<<ntohs(client.sin_port)<<"connected." << endl;
//diable buffer to improve performance
int nZero = 0;
setsockopt(ls, SOL_SOCKET, SO_SNDBUF, (char *)&nZero, sizeof(nZero));
if (CreateIoCompletionPort((HANDLE)ls,m_hIOCP,0,0) == NULL){
cout << "Binding Client Socket to IO Completion Port Failed::Reason Code::"<< GetLastError() << endl;
closesocket(ls);
}
else { //post a recv request 立即投递一个读请求
IO_DATA * data = new IO_DATA;
ZeroMemory(&data->Overlapped,sizeof(data->Overlapped));
ZeroMemory(data->Buffer,sizeof(data->Buffer));
data->opCode = IO_READ;
// data->nTotalBytes = 0;
// data->nSentBytes = 0;
data->wsabuf.buf = data->Buffer;
data->wsabuf.len = sizeof(data->Buffer);//IOCP_OVERLAPPED_MAXBUFFSIZE;
data->activeSocket = ls;
DWORD dwRecvNumBytes=0,dwFlags=0;
int nRet = WSARecv(ls,&data->wsabuf, 1, &dwRecvNumBytes,
&dwFlags,
&data->Overlapped, NULL);
if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError())){
cout << "WSARecv Failed::Reason Code::"<< WSAGetLastError() << endl;
closesocket(ls);
delete data;
}
}
}
}
bool sendPacket(SOCKET sendSock,char* buf,int sizeofbuf)
{
int cur=0;
int sended;
int toSend;
static DWORD TimetoWait=100;
while(cur<sizeofbuf)
{
toSend = sizeofbuf-cur;
sended = send(sendSock,buf+cur,toSend,0);
if(SOCKET_ERROR == sended)
{
if(sended == WSAEWOULDBLOCK)
{
printf(".");
Sleep(TimetoWait);
TimetoWait+=10;
if(TimetoWait>1000)
{ TimetoWait=1000; }
continue;}
else
{ return false;}
}
else
{
cur+=sended;
TimetoWait-=10;if(TimetoWait<100)TimetoWait=100;
}
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET tcpSock;
char desIP[30] = "127.0.0.1";
char staticMsg[250];
DWORD ddesip;
WSADATA wsaData;
int num;
::sprintf(staticMsg,"[%u]",GetCurrentProcessId());
if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{printf("SOCKET fault!application halt!%u\n",GetLastError());return -1;}
ddesip = inet_addr(desIP);
if(INADDR_NONE == ddesip)
{printf("IP invalid~\n");return -2;}
tcpSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(tcpSock == INVALID_SOCKET)
{printf("Create SOCKET failed~%u\n",GetLastError());return -3;}
sockaddr_in sAddr;
sAddr.sin_family = AF_INET;
// sAddr.sin_port = 0;
// sAddr.sin_addr.s_addr = 0;
// if(bind(tcpSock,(struct sockaddr*)&sAddr,sizeof(sAddr))==SOCKET_ERROR)
// {printf("bind SOCKET failed~%u\n",GetLastError());closesocket(tcpSock);return -4;}
sAddr.sin_port = htons(52388);
sAddr.sin_addr.s_addr = ddesip;
if(SOCKET_ERROR == connect(tcpSock,(sockaddr*)&sAddr,sizeof(sockaddr_in)))
{
printf("SOCKET connect port:52388 failed~ try port:52389\n");
sAddr.sin_port = htons(52389);
if(SOCKET_ERROR == connect(tcpSock,(sockaddr*)&sAddr,sizeof(sockaddr_in)))
{printf("SOCKET connect failed~%u\n",GetLastError());closesocket(tcpSock);return -5;}
}
int times = 50;
while(sendPacket(tcpSock,staticMsg,strlen(staticMsg)+1) && times-->0)
{
//SEND的非常HAPPY啊!
//num = ::recv(tcpSock,staticMsg,250,0);
//if(SOCKET_ERROR != num)
//{
// printf(staticMsg);
//}
Sleep(1000);
printf("!");
}
shutdown(tcpSock,0x02);
closesocket(tcpSock);
return 0;
}