實現1對n可配置socket伺服器程式思路
大致思路:框架是mfc單文件程式, 從csocket派生乙個clisten類,然後在doc類:cwebdoc中的onnewdocument函式中new乙個clisten物件,將該物件指標儲存到文件類成員m_psocket中,並把文件指標傳遞給clisten類:
m_psocket = new clisten ( this ) ;
onnewdocument接著呼叫clisten的create:
onnewdocument接著呼叫clisten的listen,開始監聽伺服器m_wwwport埠:
m_psocket->listen();
當伺服器m_wwwport埠偵聽到連線請求時,clisten類的onaccept過載函式會被呼叫。在clisten類的onaccept中呼叫我們在doc類中自建的乙個onaccept()函式。
void clisten::onaccept(int nerrorcode)
顯然,一旦某個客戶的連線請求到來,我們在doc類中自建的onaccept()函式,馬上被呼叫,**如上。doc類的onaccept()函式馬上new乙個cclient(派生自csocket),並把文件指標傳遞給cclient類:
cclient *pclient = new cclient ( this ) ;
接下來用clisten指標m_psocket來呼叫accept,並把剛剛new的cclient物件作為引數:
m_psocket->accept ( *pclient );
如無意外,乙個套接字連線就建立了。因為伺服器要1對n服務,為了維護這些連線,我們在文件類增加了乙個cptrlist成員:m_listconnects; 連線一旦建立,立即測試當前m_listconnects中的已有連線數是否已經達到最大連線限制:
當然,如果連線list還沒有滿載,馬上呼叫m_listconnects的addtail把cclient指標加進指標鍊錶成員中,以便後來伺服器與各客戶收發報文使用。
在cclient的onreceive函式中,我們接受客戶發來的資料,並分析資料,處理資料,完後傳送響應報文:
void cclient::onreceive(int nerrorcode)
在cclient的onclose函式中,我們可以記載客戶關閉套接字的事件:
void cclient::onclose(int nerrorcode)
typedef
struct
log_record, *lplog_record;
在cmainframe類開啟乙個timer以1分鐘為間隔,定期清理釋放不活躍客戶:
c***doc* pdoc = (c***doc*)getactivedocument() ;
pdoc->checkidleconnects() ;
在文件類的checkidleconnects函式中:
time_t tnow ;
time( &tnow ) ;
ctime cnow ( tnow ) ;
cnow -= ctimeout ;
for ( position pos = m_listconnects.getheadposition() ; pos != null ; ) }
用socket實現的檔案伺服器 1
public class forumfileclient catch exception e private socket socket private bufferedreader in private printwriter out public forumfileclient catch ex...
socket實現獲取伺服器時間
上次初步實現了一下socket的應用程式。這次在針對socket寫乙個應用程式。這次的應用是實現客戶端從主機獲取時間並且設定為自己的時間 伺服器 include include include include include include include include include defin...
swoole實現socket伺服器初探
因為專案中需要實時獲取一些 資料,以前的做法是使用ajax做定時請求,眾所周知的原因這樣效能會比較差,想用websocket來重新實現。我這裡想要實現的並不是簡單的 客戶端請求 服務端返回 這樣的邏輯,這種實現起來會很簡單,我要實現的是在伺服器端維護乙個列表,當有客戶端在這個列表中註冊的話,服務端便...