Windows網路程式設計(五) 多執行緒訊息處理

2021-09-01 20:58:38 字數 3249 閱讀 7716

對於服務端來說,呼叫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...