開啟服務和停止服務

2021-09-09 03:00:03 字數 3222 閱讀 7437

start函式用於開啟服務

1 初始化狀態變數

2 建立監聽套接字

3 載入使用擴充套件api函式

4 建立完成埠物件

5 建立監聽套接字和完成埠物件間的關聯

6 為監聽套接字註冊fd_accept時間

7 投遞acceptex io不夠時可以得到通知後建立監聽執行緒

bool ciocopserver::start(int nport,int nmaxconnnections,int nmaxfreebuffers,int nmaxfreecontexts,int

ninitialreads)

::listen(m_slisten,

200);

//建立完成埠

m_hconnection = ::createiocompletionport(invalid_handle_value,0,0,0

);

//載入擴充套件函式acceptex

guid guidacceptex =wsaid_acceptex;

dword dwbytes;

wsaiotcl(

m_slisten,

sio_get_extension_function_pointer,

&guidacceptex,

sizeof

(guidacceptex),

&m_lpfnacceptex,

sizeof

(m_lpfnacceptex),

&dwbytes,

null,

null

);//載入getacceptexsockaddrs

guid guidacceptexsockaddrs =wsaid_getacceptexsockaddrs;

::wsaioctl(m_slisten,

sio_get_extension_function_pointer,

&guigetacceptexsockaddrs,

sizeof

(guidgetacceptexsockaddrs),

&m_lpfnacceptexsockaddrs,

sizeof

(m_lofnacceptexsockaddrs),

&dwbytes,

null,

null);

//將監聽套接字關聯到完成埠

::createiocompletionport((handle)m_slisten,m_hconnection,(dword)0,0

);

//註冊fd_accept事件

wsaeventselect(m_slisten,m_hacceptevent,fd_accept);

//建立監聽執行緒

m_hlistenthread = ::createthread(null,0,_listenthreadproc,this,0

,null);

return

true;

}

監聽執行緒_listenthreadproc主要責任:監聽套接字投遞acceptex io請求。

m_hacceptevent:當winsock接收到新的連線請求,但是acceptex io,請求來接收這個連線時,就會觸發該時間物件。

m_hrepostevent:與io進行互動。

_listenthreadproc在下面3中情況下投遞accept請求:

1 程式初始化,要先投遞幾個accept請求,個數由使用者指定

2 處理io的執行緒接受到乙個客戶,使m_hrepostevent時間受信,_listenthreadproc執行緒得到通知後再投遞乙個accept請求。

3 程式執行期間,如果投遞的accept請求不夠用,使用者的連線請求未能夠馬上處理,這時候再投遞若干個accept請求。

dword winapi ciocpserver::_listenthreadproc(lpvoid lpparam)

//構建事件物件陣列

handle hwaitevents[2+max_thread];

int neventcount = 0

; hwaitevents[neventcount++]=pthis->m_hacceptevent;

hwaitevents[neventcount++]=pthis->m_hrepostevent;

//建立指定數量的工作執行緒在完成埠上處理io

for(i=0;i)

//下面進入無限迴圈,處理時間物件陣列中的事件

while

(true)

//等待io處理執行緒退出

::waitformultipleobjects(max_thread,&hwaitevents[2],true,5*1000

);

for(i=2;i2;i++)

::closehandle(pthis->m_hcompletion);

pthis->freebuffers();

pthis->freecontexts();

::exitthread(0);

}//定時檢查所有未返回的acceptex io的連線建立多長時間

if(nindex ==wsa_wait_timeout)

pbuffer = pbuffer->pnext;}}

else

}else

if(nindex==1)//

m_hrepostevent事件物件受信,說明處理io的執行緒接受到新的客戶

else

if(nindex>1)//

io服務執行緒退出,說明有錯誤發生,關閉伺服器

//投遞nlimit個acceptex io 請求

int i=0

;

while(i++ < nlimit && pthis->m_npendingacceptcount < pthis->m_nmaxaccepts)

}}

}return0;

}

3 停止服務函式shutdown

void

ciocpserver::shutdown()

vc 啟動和停止服務

包含標頭檔案 include 以下以web服務為例 include void cstartservicedlg onbnclickedbutton1 開啟www服務。sc handle hsvc openservice hsc,w3svc service start service query st...

vc 啟動和停止服務

包含標頭檔案 include 以下以web服務為例 include void cstartservicedlg onbnclickedbutton1 開啟www服務。sc handle hsvc openservice hsc,w3svc service start service query st...

啟動和停止MySQL服務

啟動linux系統,rhel6.5自帶的mysql資料庫 1.啟動mysql服務 啟動mysql服務的命令為 etc init.d mysqld start命令執行後如圖7 5所示,表示啟動mysql服務成功。也可以用 etc init.d mysqld的簡化命令啟動mysql服務 service ...