伺服器開源節流

2022-08-22 12:33:11 字數 3304 閱讀 8348

乙個服務端,被多個使用者連線,為了節約環境資源,減少執行緒  。

輪詢缺點:客戶端多的情況下,詢問時間大大大於接受時間浪費資源,一般為64位以下使用者體驗不到卡頓的效果

//設定非同步套接字,使可以接受資料不等待

設定套接字阻塞和非阻塞

u_long block = 1;

ioctlsocket(s, fionbio, &block);

//接受了乙個客戶端就將它加入佇列

int cs = accept(s, (sockaddr*)&caddr, &len);

clients[count++] = cs;

//輪詢 輪流問一下每個客戶端是否有訊息接受

for (int i = 0; i < count; i++)

char msg[260] = ;

int bytes = recv(clients[i], msg, sizeof(msg), 0);

printf("socket:%d bytes:%d msg:%s\n", clients[i], bytes, msg);  

用api實現輪詢,作業系統內部實現,比手工實現速度更優

主線程記錄多少個執行緒

和多少個客戶端

一般64個客戶端乙個執行緒

客戶端  cline[64];   ncline;

執行緒  thread[65535]; nthread;

每產生乙個執行緒都需要new乙個客戶端   每來乙個客戶端  客戶端計數加一socket放進陣列

產生支線程需要將客戶端資訊另存進 fd_set 結構體中,避免和主線程同步。

fd_set ;

fd_zero(&set); /*將

set清零使集合中不含任何

fd*/

fd_set(fd, &set); /*將

fd加入

set集合

*/fd_clr(fd, &set); /*將fd從

set集合中清除

*/fd_isset(fd, &set); /*在呼叫

select()

函式後,用

fd_isset

來檢測fd

是否在set

集合中,當檢測到fd在

set中則返回真,否則,返回假(0)

*/fd_set set;

fd_zero(&set);       初始化

for (int i = 0; i < info->count; i++)    新增socket加入set集合

fd_set(info->clients[i], &set);

//輪詢

timeval tv = ;

int recv_count = select(0, &set, null, null, &tv);

for (int i = 0; i < set.fd_count; i++)

if(fd_isset(set.fd_array[i], &set))

recv(set.fd_array[i], msg, sizeof(msg), 0);

printf("socket:%d bytes:%d msg:%s\n", set.fd_array[i], bytes, msg);

因為在接收資料方面花費時間太多,所以希望有訊息就通知

通知套接字

埠有請求事件發生.

#include

intpascal far wsaasyncselect (socket s,hwnd hwnd,

unsigned int wmsg,long levent);

s 標識乙個需要事件通知的

套介面的描述符.

hwnd 標識乙個在網路事件發生時需要接收訊息的

視窗控制代碼

.wmsg 在網路事件發生時要接收的訊息

.levent位遮蔽碼,用於指明應用程式感興趣的網路事件集合

.但是這個api必須要視窗過程才能使用。

產生客戶端就產生訊息請求,通過引數知道對應的socket和訊息引數

lparam的高字段則含有乙個錯誤碼,事件和錯誤碼可以通過下面的巨集從

lparam

中取出:

#define wsagetselectevent(lparam) loword(lparam)   //獲取事件

#define wsagetselecterror(lparam) hiword(lparam)  //獲取錯誤

建立乙個初始狀態為失信的匿名的需要手動重置的

事件物件

。#include

wsaevent wsaapi wsacreateevent( void );

返回值:

如果函式成功,則返回值即是

事件物件

的控制代碼。

如果函式失敗,返回wsa_invalid_event。應用程式可通過呼叫

wsagetlasterror()

函式獲取進一步的

錯誤資訊

。錯誤**

:wsanotinitialised 在呼叫本

api之前應成功呼叫

wsastartup()

。wsaenetdown 網路子系統失效。

wsa_not_enough_memory 無足夠記憶體建立

事件物件

。wsaeventselect模型是

windowssockets

提供的乙個有用非同步

i/o模型。該模型允許在乙個或者多個

套接字上接收以事件為基礎的網路事件通知。windows sockets應用程式在建立

套接字後,呼叫

wsaeventselect()

函式,將乙個

事件物件

與網路事件集合關聯在一起。當網路事件發生時,應用程式以事件的形式接收網路事件通知。

使用這個模型的基本思路是為感興趣的一組網路事件建立乙個事件物件,再呼叫wsaeventselect()函式將網路事件和事件物件關聯起來。當網路事件發生時,

winsock

使相應的事件物件受信,在事件物件上的等待函式就會返回。

winsock中建立事件物件的函式是

wsacreateevent,

定義如下:

wsaevent wsacreateevent(void); //返回乙個手工重置的事件物件控制代碼

建立事件物件之後,必須呼叫wsaeventselect函式將指定的一組網路事件與它關聯在一起,函式用法如下。

wsaeventselect模型簡單易用,也不需要視窗環境。該模型唯一的缺點是有最多等待64個

事件物件

的限制,當

套接字連線數量增加時,就必須建立多個執行緒來處理i/o,也就是所謂的

執行緒池。

滴滴開源節流

2月23日訊息,繼2月15日程維宣布滴滴公司裁員2000人後,為了更好的節約內部費用,提高內部效率,滴滴近日將嚴格控制各項費用支出,對部分員工服務進行了調整。近日,滴滴發布了 關於控制開支,減少浪費的通知 通知指出,滴滴將對全員夜宵 茶水間飲品 下午茶 健身房 咖啡廳 員工餐補 生日禮物等均進行了相...

生活成本,開源節流

發現,這一年以來都存不下錢,昨天算了下賬,發現,哎,花錢如流水。每個月固定支出 房租 1500 水電上網 350 費 100 乙個月固定花銷 早晚飯 水果 雜物 2000 每個月房貸 2400 每個月意外支出 朋友聚會,過節吃飯 300 500 大約7000塊錢,瘋掉了,每個月到手工資也才只有800...

開源節流固然重要,但理財更重要

有人把勤儉作為美德,古有明訓 大富由天,小富由儉 好像致富的不二法門就是開源節流,中國的儲蓄率也因此一直居世界的前幾名。然而,在這個競爭日新月異的時代,那些成為千萬富翁的人們卻持有這樣的觀念 開源節流固然重要,但理財更為重要。設想一下,假如你要掙到1億元,那麼在1億多的財富之中,究竟有多少錢是由勤儉...