多執行緒的服務端
//server
#pragma comment(lib, "ws2_32.lib")
#include #include #includeusing namespace std;
//處理服務
unsigned _stdcall do_service(void* p)
; while (1)
if (ret == 0)
if (ret > 0)
memset(buf, 0, sizeof buf); //置0 }
closesocket(conn);
return 0;
}int main(void)
//檢查協議棧的安裝資訊
if (lobyte(wsadata.wversion) != 2 ||
hibyte(wsadata.wversion) != 2)
//或者使用下面的方法
//if (wsadata.wversion != wversionrequested)
// socket listenfd; //建立socket
listenfd = socket(pf_inet, sock_stream, ipproto_tcp); //tcp協議
if (listenfd == invalid_socket) //建立失敗
sockaddr_in servaddr; //伺服器位址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = af_inet; //位址族
= htonl(inaddr_any);
servaddr.sin_addr.s_addr = htonl(inaddr_any); //指定ip位址 4位元組主機位元組序轉換為網路位元組序
servaddr.sin_port = htons(8888); //埠號 2位元組主機位元組序轉換為網路位元組序
int ret;
int opt = 1;
ret = setsockopt(listenfd, sol_socket, so_reuseaddr, (char*)&opt, sizeof(opt)); //設定位址重複利用
if (ret == socket_error)
//繫結
ret = bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr));
if (ret == socket_error)
//監聽
ret = listen(listenfd, somaxconn);
if (ret == socket_error)
socket conn;
sockaddr_in peeraddr;
int peerlen;
while (1)
//將乙個十進位制網路位元組序轉換為點分十進位制ip格式的字串 2位元組網路位元組序轉換為主機位元組序
cout << inet_ntoa(peeraddr.sin_addr) << " " << ntohs(peeraddr.sin_port) << endl;
unsigned threadid;
handle hthread=(handle)_beginthreadex(null, 0, do_service, (void*)conn, 0, &threadid);
if (hthread == null)
closehandle(hthread);
} wsacleanup();
return 0;
}
注意在服務端沒有呼叫waitforsignalobject,否則主線程會阻塞,其他客戶端不能通訊。 c 多執行緒程式設計 四 補充
本文是對c 11 多執行緒程式設計 一 三 的補充 api說明 yield 讓出處理器,重新排程各執行執行緒 get id 返回當前執行緒的執行緒 id sleep for 使當前執行緒暫停指定的時間段 sleep until 使當前執行緒暫停直到指定的時間點 後面三個比較容易理解,比如 std t...
C 多執行緒程式設計之四
例程4 multithread4 該例程測試在windows下最多可建立執行緒的數目。建立乙個基於對話方塊的工程multithread4,在對話方塊idd multithread4 dialog中加入乙個按鈕idc test和乙個編輯框idc count,按鈕標題為 測試 編輯框屬性選中read o...
c c 多執行緒程式設計基礎講解(四)
經過前面的幾個例子,是不是還少個執行緒建立時屬性引數沒有提到,見下文示例 cpp view plain copy include include include include using namespace std define num threads 5 void say hello void ...