socket模型處理多個客戶端

2021-07-05 06:20:26 字數 1851 閱讀 6152

最近學完了簡單的socket程式設計,發現其實socket的網路程式設計其實並沒有什麼難度,只是簡單的函式呼叫,記住客戶端與服務端的步驟,寫起來基本沒有什麼問題。

在伺服器程式的設計中,乙個伺服器不可能只相應乙個客戶端的鏈結,為了響應多個客戶端的鏈結,需要使用多執行緒的方式,每當有乙個客戶端連線進來,我們就開闢乙個執行緒,用來處理雙方的互動(主要是利用recv或者recvfrom用於收發資訊),由於但是在網路中可能出現這樣一種情況:由於處理比較複雜,下一條資訊到來之後,上一條資訊的處理還沒有完成,這樣資訊太多了之後系統的緩衝佔滿之後可能會發生丟包的現象,所以為了解決這個問題,需要另外再開乙個執行緒,專門用來處理接收到的資料,這樣總共至少有3個執行緒,主線程,收發資訊的執行緒,處理執行緒;這樣可能也不完整,處理的操作種類多了的話可能需要根據不同的請求來開闢不同的執行緒用來處理這一類請求,下面是實現這一思路的部分**:

全域性變數:

dword winapi acceptthread(lpvoid lpparameter);

dword winapi recvthread(lpvoid lpparameter);

dword g_nacceptid =

123;

dword g_nrecvid =

234;

handle g_haccpetthread;

handle g_hrecvthread;

主線程函式:

int _tmain(int argc, _tchar* argv)

sockaddr_in srvaddr = ;

srvaddr.sin_family = af_inet;

srvaddr.sin_port = htons(6666);

srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if (socket_error == bind(socklisten, (sockaddr*)&srvaddr, sizeof(sockaddr)))

if (socket_error == listen(socklisten, 5))

while (true)

g_haccpetthread = createthread(null, 0, acceptthread, &sockconn, 0, &g_nacceptid);

}waitforsingleobject(g_haccpetthread, infinite);

wsacleanup();

return

0;}

收發資料函式:

dword winapi acceptthread(lpvoid lpparameter)

g_hrecvthread = createthread(null, 0, recvthread, pszbuf, 0, &g_nrecvid);

waitforsingleobject(g_hrecvthread, infinite);

if (0 == strcmp("exit", pszbuf))

}return

0;}

資訊處理子執行緒:

dword winapi recvthread(lpvoid lpparameter)

雖說這個解決了多個客戶端與伺服器通訊的問題,但是這樣寫確定也很明顯:所有的與客戶端通訊的socket都有程式設計師自己管理,無疑加重了程式設計師的負擔;每有乙個連線都需要建立乙個執行緒,當有大量的客戶端連線進來開闢的執行緒數是非常多的,執行緒是非常耗資源的,所以為了解決這些問題就提出了非同步的i/o模型,它們解決了這些問題,由系統管理套接字,不要要人為的乙個個管理,同時不需要開闢多個執行緒來處理與客戶端的連線,我們可以將執行緒主要用於處理客戶端的請求上;

SOCKET客戶端程式設計

1.建立socket物件 socket建構函式有4個引數,第乙個是family,代表位址家族af net,af net6等,第二個是type,套接字型別sock stream 流套接字 和sock dgram 資料報套接字 import socket s socket.socket socket.a...

Socket實現HTTP客戶端

前些日子用 wininet做專案。功能忒強大了。但總覺得管理cookie有點不方便。即使設定了自己手動管理cookies。這天上掉餡餅的事還真的常常發生。比如你之前用瀏覽器訪問了這個站,留下了cookie 你再用wininet訪問的時候,這個餡餅就出現了。封包不難 連線後。將 headers一股腦堆...

socket程式設計範本 客戶端

include include void main if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 socket sockclient socket af inet,sock stream,0 建立套接字 socket sockaddr ...