對於服務端來說,呼叫accept()函式同意客戶端連線的請求後,需要處理完與這個客戶端的通訊後回到accept()繼續等待下乙個客戶端的連線,如果乙個客戶端請求連線時服務端並沒有在accept()處等待,客戶端是無法成功連上服務端的,因此併發客戶端連線的服務端必然是多執行緒的。
服務端:
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
dword winapi communicationthread
(lpvoid lpparameter)
else
if(iresult == socket_error)
// 失敗原因,socket錯誤
else
if(iresult >0)
// 資料接收成功
dwfilesize =
getfilesize
(hfile,
null);
lpreadbuf =
heapalloc
(getprocessheap()
,0,4096);
while
(true)
bytessent =
send
(socket,
(const
char
*)lpreadbuf, dwbytesread,0)
;if(bytessent == socket_error)
printf
("\tcommunicationthread(%d)\tsend %d bytes\n"
, dwtid, bytessent)
; dwsendfile +
= dwbytesread;
if(dwsendfile == dwfilesize)
}heapfree
(getprocessheap()
,0, lpreadbuf)
;closehandle
(hfile)
;closesocket
(socket);}
elseif(
lstrcmpi
(szrequest,
"get information")==
0)printf
("\tcommunicationthread(%d)\tsend %d bytes\n"
, dwtid, bytessent);}
else
}heapfree
(getprocessheap()
,0, szrequest)
;closesocket
(socket)
;return0;
}int
_tmain
(int argc, _tchar argv)
iresult =
getaddrinfo
(null
,"12000"
,&hints,
&result);if
(iresult != no_error)
listensocket =
socket
(result->ai_family, result->ai_socktype, result->ai_protocol);if
(listensocket == invalid_socket)
iresult =
bind
(listensocket, result->ai_addr, result->ai_addrlen);if
(iresult == socket_error)
freeaddrinfo
(result)
; iresult =
listen
(listensocket, somaxconn);if
(iresult == socket_error)
while
(true)if(
!createthread
(null,0
, communicationthread,
(lpvoid)clientsocket,0,
null))
}wsacleanup()
;return0;
}
客戶端:
#include
#include
#pragma comment(lib,"ws2_32.lib")
int_tmain
(int argc, _tchar* argv)
connectsocket =
socket
(af_inet, sock_stream, ipproto_tcp);if
(connectsocket == invalid_socket)if(
connect
(connectsocket,
(sockaddr*
)&clientservice,
sizeof
(clientservice)
)== socket_error)
if(argc ==2&
(!lstrcmp
(argv[1]
,"-d"))
)// 向服務端傳送資料
bytessent =
send
(connectsocket,
// socket
sendbuf,
// 傳送的資料
lstrlen
(sendbuf)+1
,// 資料長度0)
;// 無標誌
if(bytessent == socket_error)
recvbuf =
heapalloc
(getprocessheap()
,0,8192);
while
(bytesrecv != socket_error)
// todo,處理接收的資料,這裡只簡單的將收到的資料大小顯示
printf
("bytes recv: %ld\n"
, bytesrecv);}
heapfree
(getprocessheap()
,0, recvbuf)
;wsacleanup()
;return0;
}
Windows多執行緒程式設計
一 問題的提出 編寫乙個耗時的單執行緒程式 新建乙個基於對話方塊的應用程式singlethread,在主對話方塊idd singlethread dialog新增乙個按鈕,id為idc sleep six second,標題為 延時6秒 新增按鈕的響應函式,如下 void csinglethread...
windows多執行緒程式設計
程序 乙個執行的程式,記憶體,cpu時間等都歸程序所有.執行緒 cpu排程的最小單位,乙個程序內的多個執行緒共享4g記憶體.程式的乙個執行路徑 1.最基礎的使用方法.createthread,exitthread,closehand include include createthread,exit...
Windows多執行緒程式設計
函式原型 handlewinapi createthread lpsecurity attributes lpthreadattributes,size t dwstacksize,lpthread start routine lpstartaddress,lpvoid lpparameter,dw...