第一步:建立乙個基於對話方塊的mfc工程
第二部:建立乙個新的類recvparam用於接受主線程的控制代碼和套接字
第三步:新建乙個新的按鈕用來啟動多執行緒,設定名字和id
第四步:雙擊編寫該按鈕的函式
1.套接字版本初始化
word wvesionrequested; // 儲存winsock庫的版本號
wsadata wsadata;
int err;
wvesionrequested = makeword(1,1); // 請求版本號的word值
err = wsastartup(wvesionrequested, &wsadata);
if(err != 0)
if (lobyte(wsadata.wversion)!=1 || hibyte(wsadata.wversion!=1))
2.初始化套接字
socket socksrv = socket(af_inet, sock_dgram, 0);
3.繫結
sockaddr_in addrsrv;
addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);
addrsrv.sin_family=af_inet;
addrsrv.sin_port=htons(6000);
bind(socksrv,(sockaddr*)&addrsrv,sizeof sockaddr);
4.建立接受資料多執行緒
handle hthread = createthread(null,0,recvproc,(lpvoid)precvparam,0,null);
5.關閉套接字
closesocket(m_socket);
上面個這些是實現函式,需要修改才能使用。
第五步:編寫執行緒處理函式(在cadodlg類裡面宣告該函式為靜態函式)
::postmessage(hwnd,wm_recvdata, 0, (lparam)tempbuf); // 顯示每條資料
}return 0;
}第六步:繫結wm_recvdata巨集的函式
1.在resource.h 標頭檔案定義巨集
2.在cadodlg類標頭檔案中 新增函式說明
3.在cadodlg類cpp檔案中新增訊息對映
3.實現該函式
void cadodlg::onrecvdata(wparam wparam, lparam lparam)
Soket程式設計 客戶端 服務端單執行緒通訊
客戶端 匯入socket模組 import socket 建立socket物件 clientsocket socket.socket socket.af inet,socket.sock stream 獲取本機ip位址 host socket.gethostbyname socket.gethost...
基於UDP的服務端 客戶端
udp套接字的特點 udp提供的是不可靠的傳輸服務。如果只考慮可靠性tcp要優於udp,但是udp的結構要比tcp更簡潔。udp不會傳送ack的應答資訊,也不會像seq那樣給資料分配序號。因此,udp效能有時比tcp高出很多。程式設計實現簡單。可靠性雖然不及tcp,但也不會像想象中那麼頻繁的資料損毀...
單執行緒的redis如何實現阻塞佇列
從redis的api可以了解到lpop,rpop可以實現乙個阻塞式佇列。那疑問就來了,redis不是單執行緒的嗎,如果阻塞了,那其他操作就執行不了呀。事實不是這樣的 redis的執行緒模型,是接收客戶端命令的執行緒時 i o 多路復用的,再通過檔案事件分配器單執行緒執行的。如下圖,程式總是會將所有產...