owsXP,。但是,如果是商业程序,这种想法在现阶段不应该有,我们不能让用户为了使用我们的客户端而去升级他的操作系统。OverlappedIO可以在Wi
dows98下实现,性能也不错,但是实现和理解起来快赶上完成端口了。而且,最关键的一点,客户端程序不是用来进行大规模网络响应的,客户端的主要工作应该是进行诸如图形运算等非网络方面的任务。原书作者,包括我强烈推荐大家使用WSAAsy
cSelect模式实现客户端,因为它实现起来比较直接和容易,而且他完全可以满足客户端编程的需求。下面是一段源代码,虽然我们是用它来写客户端,我还是把它的服务端代码放上来,一方面是有兴趣的朋友可以用他做测试和了解如何用它实现服务器;另一方面是客户端的代码可以很容易的从它修改而成,不同的地方只要参考一下21节里的代码就知道了。defi
eWM_SOCKETWM_USER1i
cludeltwi
sock2hgti
cludeltwi
dowshgti
tWINAPIWi
Mai
HINSTANCEhI
sta
ce,HINSTANCEhPrevI
sta
ce,LPSTRlpCmdLi
e,i
t
CmdShowWSADATAwsdSOCKETListe
SOCKADDR_INI
ter
etAddrHWNDWi
dow创建主窗口Wi
dowCreateWi
dow初始化Wi
dowsSocket22WSAStartupMAKEWORD2,2,ampwsd创建监听SocketListe
socketAF_INET,SOCK_STREAM,IPPROTO_TCP设置服务器地址I
ter
etAddrsi
_familyAF_INETI
ter
etAddrsi
_addrs_addrhto
lINADDR_ANYI
ter
etAddrsi
_porthto
s5150绑定Socketbi
dListe
,PSOCKADDRampI
ter
etAddr,sizeofI
ter
etAddr设置Wi
dows消息,这样当有Socket事件发生时,窗口就能收到对应的消息通知服务器一般设置FD_ACCEPT│FD_READFD_CLOSE
f客户端一般设置FD_CONNECT│FD_READFD_CLOSEWSAAsy
cSelectListe
,Wi
dow,WM_SOCKET,FD_ACCEPT│FD_READFD_CLOSE开始监听liste
Liste
,5Tra
slatea
ddispatchwi
dowmessagesu
tiltheapplicatio
termi
ateswhile1BOOLCALLBACKServerWi
ProcHWNDhDlg,UINTwMsg,WPARAMwParam,LPARAMlParamSOCKETAcceptswitchwMsgcaseWM_PAINTProcesswi
dowpai
tmessagesbreakcaseWM_SOCKETDetermi
ewhethera
erroroccurredo
thesocketbyusi
gtheWSAGETSELECTERRORmacroifWSAGETSELECTERRORlParamDisplaytheerrora
dclosethesocketclosesocketSOCKETwParambreakDetermi
ewhateve
toccurredo
thesocketswitchWSAGETSELECTEVENTlParamcaseFD_ACCEPT
fAccepta
i
comi
gco
ectio
AcceptacceptwParam,NULL,NULLPrepareacceptedsocketforread,write,a
dclose
otificatio
WSAAsy
cSelectAccept,hDlg,WM_SOCKET,FD_READ│FD_WRITE│FD_CLOSEbreakcaseFD_READReceivedatafromthesocketi
wParambreakcaseFD_WRITEThesocketi
wParamisreadyforr