udp伺服器設計過程總結

2021-04-02 09:18:43 字數 2102 閱讀 9913

原 作 者:李良剛

原 出 處:vczx.com

發 布 者:李良剛

發布型別:原創

發布日期:2004-08-25

由於,要能對多個客戶端的管理。需要通過udp,模擬多個客戶端聯接驗證的情況。 

設計選型: 

為了盡量提高可靠性和穩定性,我選用事件模型的winsock api的非同步重疊模式。只所以沒有選完成端,是因為我們的客戶端並不是很多,200以內就夠了。這個200是因為我每秒鐘要把1--4k左右的圖象資料發給200個客戶端 20次左右。如果再多,不可能完成。 

訊息模式是基於訊息的,可靠性和效率沒有事件模型高。 

winsock1.1不考慮。定為winsock2.2, 幸好,連win98都自帶winsock2.2。 

為什麼不用多播? 

一是,有些網路不支援多播,二是,多播實現起來更麻煩一些,以後再考慮這方面的實現。 

設計思路: 

建立乙個socket. 並監聽事件。 啟動執行緒接收資料. 

用乙個連表coblist, 儲存所有聯上的客戶,並通知聯接成功。這樣客戶有機會,處理這一事件並作一些動作。 

當客戶斷開時,向伺服器發乙個事件,這樣,伺服器也可以做一些收尾的事情,當然,這一些要安全的發生。 

if (nret != 0)  } 

// // if the i/o isn't finished... 

// if (fpending) 

if (dwret != wait_object_0)//wait_object_0/wait_timeout 

closehandle(over.hevent); 

trace("傳送成功/n",null); 

m_lock.unlock(); 

// // zero the buffer so the recv is null-terminated 

// memset(pbuf, 0, dwbufsize); 

// // recv event is complete -- keep statistics 

// m_translate = dwrecv; 

return true; 

} 資料處理部分。 

bool cudpsock::delwithresdata(struct sockaddr far *lpfrom) 

assert(onepagleft <= iobufflen); 

pags.buff = new char[onepagleft]; 

if(m_******iobuffer.read(pags.buff ,onepagleft))  } 

delete pags.buff; 

}else 

m_bfillhead = true; 

onepagleft = m_packhead.len - lenpag; 

if(m_******iobuffer.getbufferlen() < onepagleft) 

assert(onepagleft <= iobufflen); 

pags.buff = new char[onepagleft]; 

if(m_******iobuffer.read(pags.buff ,onepagleft))  } 

delete pags.buff; 

} } 

if(m_translate) 

catch (...)  

m_******iobuffer.notify(); 

} return ; 

一, 注意有乙個緩衝區m_******iobuffer主要用來保證每次收發的完整性。然後就是c++異常機制,主要是為了穩定性。 

二, 在cudpsock::delwithresdata的處理部分,有很多保護措施。這很重要。 

然後從cudpsock派生乙個csverudpsock如下: 

#include "udpsock.h" 

#include "clientudpconnect.h" 

#include "afxtempl.h" 

class csverudpsock : public cudpsock  

; 注意的地方就是安全處理種種聯接請求和斷開請求。 

mysql udp伺服器 UDP伺服器

傳輸層主要應用的協議模型有兩種,一種是tcp協議,另外一種則是udp協議。tcp協議在網路通訊中佔主導地位,絕大多數的網路通訊借助tcp協議完成資料傳輸。但udp也是網路通訊中不可或缺的重要通訊手段。相較於tcp而言,udp通訊的形式更像是發簡訊。不需要在資料傳輸之前建立 維護連線。只專心獲取資料就...

UDP簡單伺服器

udp簡單伺服器與客戶端 這裡用到了 recvfrom 表示接受來自何處的連線請求資訊 sendto 要向何處傳送 下面這段 是伺服器原始碼 下面主要用到 socket 建立udp協議的套接字 bind 繫結本機三元資訊 recvfrom 接收客戶端向本機伺服器傳送來得資訊 sendto 向客戶端傳...

基於UDP協議的伺服器 UDP伺服器建立方案

udp伺服器就是實現乙個基於udp協議的伺服器來與客戶端通訊。就是用來收發資料,進行資料處理的。與tcp伺服器不同的是不用建立連線,直接呼叫recvfrom來收包。跟tcp伺服器一樣,udp伺服器也可以通過使用 socketserver 庫很容易地被建立。先定義乙個實現 handle 特殊方法的類,...