| | mfc tí gōng liǎo liǎng gè lèi casyncsocket hé csocket lái fēng zhuāng winsockapi, zhè gěi chéng xù yuán tí gōng liǎo yī gè gèng jiǎn dān de wǎng luò biān chéng jiē kǒu。
casyncsocket zài jiào dī céng cì shàng fēng zhuāng liǎo winsockapi, quē shěng qíng kuàng xià, shǐ yòng gāi lèi chuàng jiàn de socket shì fēi zǔsè de socket, suǒ yòu cāo zuò dū huì lì jí fǎn huí, rú guǒ méi yòu dé dào jiēguǒ, fǎn huí wsaewouldblock, biǎo shì shì yī gè zǔsè cāo zuò。
csocket jiàn lì zài casyncsocket de jī chǔ shàng, shì casyncsocket de pài shēng lèi。 yě jiù shì quē shěng qíng kuàng xià shǐ yòng gāi lèi chuàng jiàn de socket shì fēi zǔsè de socket, dàn shì csocket de wǎng luò i/o shì zǔsè de, tā zài wán chéng rèn wù zhī hòu cái fǎn huí。 csocket de zǔsè bù shì jiàn lì zài “ zǔsè” socket de jī chǔ shàng, ér shì zài“ fēi zǔsè” socket shàng shí xiàn de zǔsè cāo zuò, zài zǔsè qī jiān, csocket shí xiàn liǎo běn xiàn chéng de xiāo xī xún huán, yīn cǐ, suī rán shì zǔsè cāo zuò, dàn shì bìng bù yǐng xiǎng xiāo xī xún huán, jí yòng hù réng rán kě yǐ hé chéng xù jiāo hù。
casyncsocket
casyncsocket fēng zhuāng liǎo dī céng de winsockapi, qí chéng yuán biàn liàng m_hsocket bǎo cún qí duì yìng de socket jù bǐng。 shǐ yòng casyncsocket de fāng fǎ rú xià:
shǒu xiān, zài duī huò zhě zhàn zhōng gòu zào yī gè casyncsocket duì xiàng, lì rú:
casyncsocketsock; huò zhě
casyncsocket*psock=newcasyncsocket;
qí cì, diào yòng create chuàng jiàn socket, lì rú:
shǐ yòng quē shěng cān shù chuàng jiàn yī gè miàn xiàng lián jiē de socket
sock.create()
zhǐ dìng cān shù cān shù chuàng jiàn yī gè shǐ yòng shù jù bào de socket, běn dì duān kǒu wéi 30
psocket.create(30,sock_dgrm);
qí sān, rú guǒ shì kè hù chéng xù, shǐ yòng connect lián jiē dào yuǎn dì; rú guǒ shì fú wù chéng xù, shǐ yòng listen jiān tīng yuǎn dì de lián jiē qǐng qiú。
qí sì, shǐ yòng chéng yuán hán shù jìn xíng wǎng luò i/o。
zuì hòu, xiāo huǐ casyncsocket, xī gòu hán shù diào yòng close chéng yuán hán shù guān bì socket。
xià miàn, fēn xī casyncsocket de jǐ gè hán shù, cóng zhōng kě yǐ kàn dào tā shì rú hé fēng zhuāng dī céng de winsockapi, jiǎn huà yòu guān cāo zuò de; hái kě yǐ kàn dào tā shì rú hé shí xiàn fēi zǔsè de socket hé fēi zǔsè cāo zuò。
socket duì xiàng de chuàng jiàn hé kǔn bǎng
( 1) create hán shù
shǒu xiān, tǎo lùn create hán shù, fēn xī socket jù bǐng rú hé bèi chuàng jiàn bìng hé casyncsocket duì xiàng guān lián。 create de shí xiàn rú xià:
boolcasyncsocket::create(uintnsocketport,intnsockettype,
longlevent,lpctstrlpszsocketaddress)
{
if(socket(nsockettype,levent))
{
if(bind(nsocketport,lpszsocketaddress))
returntrue;
intnresult=getlasterror();
close();
wsasetlasterror(nresult);
}
returnfalse;
}
qí zhōng:
cān shù 1 biǎo shì běn socket de duān kǒu, quē shěng shì 0, rú guǒ yào chuàng jiàn shù jù bào de socket, zé bì xū zhǐ dìng yī gè duān kǒu hào。
cān shù 2 biǎo shì běn socket de lèi xíng, quē shěng shì sock_stream, biǎo shì miàn xiàng lián jiē lèi xíng。
cān shù 3 shì píng bì wèi, biǎo shì xī wàng duì běn socket jiān cè de shì jiàn, quē shěng shì fd_read|fd_write|fd_oob|fd_accept|fd_connect|fd_close。
cān shù 4 biǎo shì běn socket de ip dì zhǐ zì fú chuàn, quē shěng shì null。
create diào yòng socket hán shù chuàng jiàn yī gè socket, bìng bǎ tā kǔn bǎng zài this suǒ zhǐ duì xiàng shàng, jiān cè zhǐ dìng de wǎng luò shì jiàn。 cān shù 2 hé 3 bèi chuán dì gěi socket hán shù, rú guǒ xī wàng chuàng jiàn shù jù bào de socket, bù yào shǐ yòng quē shěng cān shù, zhǐ dìng cān shù 2 shì sock_dgrm。
rú guǒ shàng yī bù zhòu chéng gōng, zé diào yòng bind gěi xīn de socket fēn pèi duān kǒu hé ip dì zhǐ。
( 2) socket hán shù
jiē zhe, fēn xī socket hán shù, qí shí xiàn rú xià:
boolcasyncsocket::socket(intnsockettype,longlevent,
intnprotocoltype,intnaddressformat)
{
assert(m_hsocket==invalid_socket);
m_hsocket=socket(naddressformat,nsockettype,nprotocoltype);
if(m_hsocket!=invalid_socket)
{
casyncsocket::attachhandle(m_hsocket,this,false);
returnasync_select_(levent);
}
returnfalse;
}
qí zhōng:
cān shù 1 biǎo shì socket lèi xíng, quē shěng zhí shì sock_stream。
cān shù 2 biǎo shì xī wàng jiān cè de wǎng luò shì jiàn, quē shěng zhí tóng create, zhǐ dìng liǎo quán bù shì jiàn。
cān shù 3 biǎo shì shǐ yòng de xié yì, quē shěng shì 0。 shí jì shàng, sock_stream lèi xíng de socket shǐ yòng tcp xié yì, sock_dgrm de socket zé shǐ yòng udp xié yì。
cān shù 4 biǎo shì dì zhǐ zú( dì zhǐ gé shì), quē shěng zhí shì pf_inet( děng tóng yú af_inet)。 duì yú tcp/ip lái shuō, xié yì zú hé dì zhǐ zú shì tóng zhí de。
zài socket méi yòu bèi chuàng jiàn zhī qián, chéng yuán biàn liàng m_hsocket shì yī gè wú xiào de socket jù bǐng。 socket hán shù bǎ xié yì zú、 socket lèi xíng、 shǐ yòng de xié yì děng xìn xī chuán dì gěi winsockapi hán shù socket, chuàng jiàn yī gè socket。 rú guǒ chuàng jiàn chéng gōng, zé bǎ tā kǔn bǎng zài this suǒ zhǐ duì xiàng。
( 3) kǔn bǎng( attatch)
kǔn bǎng guò chéng lèi sì yú qí tā windows duì xiàng, jiāng zài mó kuài xiàn chéng zhuàng tài de winsock yìng shè zhōng tiān jiā yī duì xīn de yìng shè: this suǒ zhǐ duì xiàng hé xīn chuàng jiàn de socket duì xiàng de yìng shè。
lìng wài, rú guǒ běn mó kuài xiàn chéng zhuàng tài de“ socket chuāng kǒu” méi yòu chuàng jiàn, zé chuàng jiàn yī gè, gāi chuāng kǒu zài yì bù cāo zuò shí yòng lái jiē shōu winsock de tōng zhī xiāo xī, chuāng kǒu jù bǐng bǎo cún dào mó kuài xiàn chéng zhuàng tài de m_hsocketwindow biàn liàng zhōng。 hán shù async_select_ jiāng zhǐ dìng gāi chuāng kǒu wéi wǎng luò shì jiàn xiāo xī de jiē shōu chuāng kǒu。
hán shù attachhandle de shí xiàn zài cǐ bù liè jǔ liǎo。
( 4) zhǐ dìng yào jiān cè de wǎng luò shì jiàn
zài kǔn bǎng wán chéng zhī hòu, diào yòng async_select_ zhǐ dìng xīn chuàng jiàn de socket jiāng jiān cè de wǎng luò shì jiàn。 async_select_ shí xiàn rú xià:
boolcasyncsocket::async_select_(longlevent)
{
assert(m_hsocket!=invalid_socket);
_afx_sock_thread_state*pstate=_afxsockthreadstate;
assert(pstate->m_hsocketwindow!=null);
returnwsaasync_select_(m_hsocket,pstate->m_hsocketwindow,
wm_socket_notify,levent)!=socket_error;
}
hán shù cān shù levent biǎo shì xī wàng jiān shì de wǎng luò shì jiàn。
_afxsockthreadstate dé dào de shì dāng qián de mó kuài xiàn chéng zhuàng tài, m_hsocketwindow shì běn mó kuài zài dāng qián xiàn chéng de“ socket chuāng kǒu”, zhǐ dìng jiān shì m_hsocket de wǎng luò shì jiàn, rú zhǐ dìng shì jiàn fā shēng, gěi chuāng kǒu m_hsocketwindow fā sòng wm_socket_notify xiāo xī。
bèi zhǐ dìng de wǎng luò shì jiàn duì yìng de wǎng luò i/o jiāng shì yì bù cāo zuò, shì fēi zǔsè cāo zuò。 lì rú: zhǐ dìng fr_read dǎo zhì receive shì yī gè yì bù cāo zuò, rú guǒ bù néng lì jí dú dào shù jù, zé fǎn huí yī gè cuò wù wsaewouldblock。 zài shù jù dào dá zhī hòu, winsock tōng zhī chuāng kǒu m_hsocketwindow, dǎo zhì onreceive bèi diào yòng。
zhǐ dìng fr_write dǎo zhì send shì yī gè yì bù cāo zuò, jí shǐ shù jù méi yòu sòng chū yě fǎn huí yī gè cuò wù wsaewouldblock。 zài shù jù kě yǐ fā sòng zhī hòu, winsock tōng zhī chuāng kǒu m_hsocketwindow, dǎo zhì onsend bèi diào yòng。
zhǐ dìng fr_connect dǎo zhì connect shì yī gè yì bù cāo zuò, hái méi yòu lián jiē shàng jiù fǎn huí cuò wù xìn xī wsaewouldblock, zài lián jiē wán chéng zhī hòu, winsock tōng zhī chuāng kǒu m_hsocketwindow, dǎo zhì onconnect bèi diào yòng。
duì yú qí tā wǎng luò shì jiàn, jiù bù yī yī jiě shì liǎo。
suǒ yǐ, shǐ yòng casyncsocket shí, rú guǒ shǐ yòng create quē shěng chuàng jiàn socket, zé suǒ yòu wǎng luò i/o dōushì yì bù cāo zuò, jìn xíng yòu guān wǎng luò i/o shí zé bì xū fù gài yǐ xià de xiāng guān hán shù:
onaccept、 onclose、 onconnect、 onoutofbanddata、 onreceive、 onsend。
( 5) bind hán shù
jīng guò shàng shù guò chéng, socket chuàng jiàn wán bì, xià miàn, diào yòng bind hán shù gěi m_hsocket zhǐ dìng běn dì duān kǒu hé ip dì zhǐ。 bind de shí xiàn rú xià:
boolcasyncsocket::bind(uintnsocketport,lpctstrlpszsocketaddress)
{
uses_conversion;
// shǐ yòng winsock de dì zhǐ jié gòu gòu zào dì zhǐ xìn xī
sockaddr_insockaddr;
memset(&sockaddr,0,sizeof(sockaddr));
// dé dào dì zhǐ cān shù de zhí
lpstrlpszascii=t2a((lptstr)lpszsocketaddress);
// zhǐ dìng shì internet dì zhǐ lèi xíng
sockaddr.sin_family=af_inet;
if(lpszascii==null)
// méi yòu zhǐ dìng dì zhǐ, zé zì dòng dé dào yī gè běn dì ip dì zhǐ
// bǎ 32 bǐ tè de shù jù cóng zhù jī zì jié xù zhuǎn huàn chéng wǎng luò zì jié xù
sockaddr.sin_addr.s_addr=htonl(inaddr_any);
else
{
// dé dào dì zhǐ
dwordlresult=inet_addr(lpszascii);
if(lresult==inaddr_none)
{
wsasetlasterror(wsaeinval);
returnfalse;
}
sockaddr.sin_addr.s_addr=lresult;
}
// rú guǒ duān kǒu wéi 0, zé winsock fēn pèi yī gè duān kǒu( 1024 héng 5000)
// bǎ 16 bǐ tè de shù jù cóng zhù jī zì jié xù zhuǎn huàn chéng wǎng luò zì jié xù
sockaddr.sin_port=htons((u_short)nsocketport);
//bind diào yòng winsockapi hán shù bind
returnbind((sockaddr*)&sockaddr,sizeof(sockaddr));
}
qí zhōng: hán shù cān shù 1 zhǐ dìng liǎo duān kǒu; cān shù 2 zhǐ dìng liǎo yī gè bāo hán běn dì dì zhǐ de zì fú chuàn, quē shěng shì null。
hán shù bind shǒu xiān shǐ yòng jié gòu sockaddr_in gòu zào dì zhǐ xìn xī。 gāi jié gòu de yù sin_family biǎo shì dì zhǐ gé shì( tcp/ip tóng xié yì zú), fù zhí wéi af_inet( internet dì zhǐ gé shì); yù sin_port biǎo shì duān kǒu, rú guǒ cān shù 1 wéi 0, zé winsock fēn pèi yī gè duān kǒujǐ tā, fàn wéi zài 1024 hé 5000 zhī jiān; yù sin_addr shì biǎo shì dì zhǐ xìn xī, tā shì yī gè lián hé tǐ, qí zhōng s_addr biǎo shì rú xià xíng shì de zì fú chuàn,“ 28.56.22.8”。 rú guǒ cān shù méi yòu zhǐ dìng dì zhǐ, zé winsock zì dòng dì dé dào běn dì ip dì zhǐ( rú guǒ yòu jǐ gè wǎng kǎ, zé shǐ yòng qí zhōng yī gè de dì zhǐ)。
( 6) zǒng jié create de guò chéng
shǒu xiān, diào yòng socket hán shù chuàng jiàn yī gè socket; rán hòu bǎ chuàng jiàn de socket duì xiàng yìng shè dào casyncsocket duì xiàng( kǔn bǎng zài yī qǐ), zhǐ dìng běn socket yào tōng zhī de wǎng luò shì jiàn, bìng chuàng jiàn yī gè“ socket chuāng kǒu” lái jiē shōu wǎng luò shì jiàn xiāo xī, zuì hòu, zhǐ dìng socket de běn dì xìn xī。
xià yī bù, shì shǐ yòng chéng yuán hán shù connect lián jiē yuǎn dì zhù jī, pèi zhì socket de yuǎn dì xìn xī。 hán shù connect lèi sì yú bind, bǎ zhǐ dìng de yuǎn dì dì zhǐ zhuǎn huàn chéng sockaddr_in duì xiàng biǎo shì de dì zhǐ xìn xī( bāo kuò wǎng luò zì jié xù de zhuǎn huàn), rán hòu diào yòng winsock hán shù connect lián jiē yuǎn dì zhù jī, pèi zhì socket de yuǎn dì duān kǒu hé yuǎn dì ip dì zhǐ。 | | MFC tí gōng liǎo liǎng gè lèi CAsyncSocket hé CSocket lái fēng zhuāng WinSockAPI, zhè gěi chéng xù yuán tí gōng liǎo yī gè gèng jiǎn dān de wǎng luò biān chéng jiē kǒu。
CAsyncSocket zài jiào dī céng cì shàng fēng zhuāng liǎo WinSockAPI, quē shěng qíng kuàng xià, shǐ yòng gāi lèi chuàng jiàn de socket shì fēi zǔsè de socket, suǒ yòu cāo zuò dū huì lì jí fǎn huí, rú guǒ méi yòu dé dào jiēguǒ, fǎn huí WSAEWOULDBLOCK, biǎo shì shì yī gè zǔsè cāo zuò。
CSocket jiàn lì zài CAsyncSocket de jī chǔ shàng, shì CAsyncSocket de pài shēng lèi。 yě jiù shì quē shěng qíng kuàng xià shǐ yòng gāi lèi chuàng jiàn de socket shì fēi zǔsè de socket, dàn shì CSocket de wǎng luò I/O shì zǔsè de, tā zài wán chéng rèn wù zhī hòu cái fǎn huí。 CSocket de zǔsè bù shì jiàn lì zài“ zǔsè” socket de jī chǔ shàng, ér shì zài“ fēi zǔsè” socket shàng shí xiàn de zǔsè cāo zuò, zài zǔsè qī jiān, CSocket shí xiàn liǎo běn xiàn chéng de xiāo xī xún huán, yīn cǐ, suī rán shì zǔsè cāo zuò, dàn shì bìng bù yǐng xiǎng xiāo xī xún huán, jí yòng hù réng rán kě yǐ hé chéng xù jiāo hù。
CAsyncSocket
CAsyncSocket fēng zhuāng liǎo dī céng de WinSockAPI, qí chéng yuán biàn liàng m_hSocket bǎo cún qí duì yìng de socket jù bǐng。 shǐ yòng CAsyncSocket de fāng fǎ rú xià:
shǒu xiān, zài duī huò zhě zhàn zhōng gòu zào yī gè CAsyncSocket duì xiàng, lì rú:
CAsyncSocketsock; huò zhě
CAsyncSocket*pSock=newCAsyncSocket;
qí cì, diào yòng Create chuàng jiàn socket, lì rú:
shǐ yòng quē shěng cān shù chuàng jiàn yī gè miàn xiàng lián jiē de socket
sock.Create()
zhǐ dìng cān shù cān shù chuàng jiàn yī gè shǐ yòng shù jù bào de socket, běn dì duān kǒu wéi 30
pSocket.Create(30,SOCK_DGRM);
qí sān, rú guǒ shì kè hù chéng xù, shǐ yòng Connect lián jiē dào yuǎn dì; rú guǒ shì fú wù chéng xù, shǐ yòng Listen jiān tīng yuǎn dì de lián jiē qǐng qiú。
qí sì, shǐ yòng chéng yuán hán shù jìn xíng wǎng luò I/O。
zuì hòu, xiāo huǐ CAsyncSocket, xī gòu hán shù diào yòng Close chéng yuán hán shù guān bì socket。
xià miàn, fēn xī CAsyncSocket de jǐ gè hán shù, cóng zhōng kě yǐ kàn dào tā shì rú hé fēng zhuāng dī céng de WinSockAPI, jiǎn huà yòu guān cāo zuò de; hái kě yǐ kàn dào tā shì rú hé shí xiàn fēi zǔsè de socket hé fēi zǔsè cāo zuò。
socket duì xiàng de chuàng jiàn hé kǔn bǎng
( 1) Create hán shù
shǒu xiān, tǎo lùn Create hán shù, fēn xī socket jù bǐng rú hé bèi chuàng jiàn bìng hé CAsyncSocket duì xiàng guān lián。 Create de shí xiàn rú xià:
BOOLCAsyncSocket::Create(UINTnSocketPort,intnSocketType,
longlEvent,LPCTSTRlpszSocketAddress)
{
if(Socket(nSocketType,lEvent))
{
if(Bind(nSocketPort,lpszSocketAddress))
returnTRUE;
intnResult=GetLastError();
Close();
WSASetLastError(nResult);
}
returnFALSE;
}
qí zhōng:
cān shù 1 biǎo shì běn socket de duān kǒu, quē shěng shì 0, rú guǒ yào chuàng jiàn shù jù bào de socket, zé bì xū zhǐ dìng yī gè duān kǒu hào。
cān shù 2 biǎo shì běn socket de lèi xíng, quē shěng shì SOCK_STREAM, biǎo shì miàn xiàng lián jiē lèi xíng。
cān shù 3 shì píng bì wèi, biǎo shì xī wàng duì běn socket jiān cè de shì jiàn, quē shěng shì FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE。
cān shù 4 biǎo shì běn socket de IP dì zhǐ zì fú chuàn, quē shěng shì NULL。
Create diào yòng Socket hán shù chuàng jiàn yī gè socket, bìng bǎ tā kǔn bǎng zài this suǒ zhǐ duì xiàng shàng, jiān cè zhǐ dìng de wǎng luò shì jiàn。 cān shù 2 hé 3 bèi chuán dì gěi Socket hán shù, rú guǒ xī wàng chuàng jiàn shù jù bào de socket, bù yào shǐ yòng quē shěng cān shù, zhǐ dìng cān shù 2 shì SOCK_DGRM。
rú guǒ shàng yī bù zhòu chéng gōng, zé diào yòng bind gěi xīn de socket fēn pèi duān kǒu hé IP dì zhǐ。
( 2) Socket hán shù
jiē zhe, fēn xī Socket hán shù, qí shí xiàn rú xià:
BOOLCAsyncSocket::Socket(intnSocketType,longlEvent,
intnProtocolType,intnAddressFormat)
{
ASSERT(m_hSocket==INVALID_SOCKET);
m_hSocket=socket(nAddressFormat,nSocketType,nProtocolType);
if(m_hSocket!=INVALID_SOCKET)
{
CAsyncSocket::AttachHandle(m_hSocket,this,FALSE);
returnAsyncSelect(lEvent);
}
returnFALSE;
}
qí zhōng:
cān shù 1 biǎo shì Socket lèi xíng, quē shěng zhí shì SOCK_STREAM。
cān shù 2 biǎo shì xī wàng jiān cè de wǎng luò shì jiàn, quē shěng zhí tóng Create, zhǐ dìng liǎo quán bù shì jiàn。
cān shù 3 biǎo shì shǐ yòng de xié yì, quē shěng shì 0。 shí jì shàng, SOCK_STREAM lèi xíng de socket shǐ yòng TCP xié yì, SOCK_DGRM de socket zé shǐ yòng UDP xié yì。
cān shù 4 biǎo shì dì zhǐ zú( dì zhǐ gé shì), quē shěng zhí shì PF_INET( děng tóng yú AF_INET)。 duì yú TCP/IP lái shuō, xié yì zú hé dì zhǐ zú shì tóng zhí de。
zài socket méi yòu bèi chuàng jiàn zhī qián, chéng yuán biàn liàng m_hSocket shì yī gè wú xiào de socket jù bǐng。 Socket hán shù bǎ xié yì zú、 socket lèi xíng、 shǐ yòng de xié yì děng xìn xī chuán dì gěi WinSockAPI hán shù socket, chuàng jiàn yī gè socket。 rú guǒ chuàng jiàn chéng gōng, zé bǎ tā kǔn bǎng zài this suǒ zhǐ duì xiàng。
( 3) kǔn bǎng( Attatch)
kǔn bǎng guò chéng lèi sì yú qí tā Windows duì xiàng, jiāng zài mó kuài xiàn chéng zhuàng tài de WinSock yìng shè zhōng tiān jiā yī duì xīn de yìng shè: this suǒ zhǐ duì xiàng hé xīn chuàng jiàn de socket duì xiàng de yìng shè。
lìng wài, rú guǒ běn mó kuài xiàn chéng zhuàng tài de“ socket chuāng kǒu” méi yòu chuàng jiàn, zé chuàng jiàn yī gè, gāi chuāng kǒu zài yì bù cāo zuò shí yòng lái jiē shōu WinSock de tōng zhī xiāo xī, chuāng kǒu jù bǐng bǎo cún dào mó kuài xiàn chéng zhuàng tài de m_hSocketWindow biàn liàng zhōng。 hán shù AsyncSelect jiāng zhǐ dìng gāi chuāng kǒu wéi wǎng luò shì jiàn xiāo xī de jiē shōu chuāng kǒu。
hán shù AttachHandle de shí xiàn zài cǐ bù liè jǔ liǎo。
( 4) zhǐ dìng yào jiān cè de wǎng luò shì jiàn
zài kǔn bǎng wán chéng zhī hòu, diào yòng AsyncSelect zhǐ dìng xīn chuàng jiàn de socket jiāng jiān cè de wǎng luò shì jiàn。 AsyncSelect shí xiàn rú xià:
BOOLCAsyncSocket::AsyncSelect(longlEvent)
{
ASSERT(m_hSocket!=INVALID_SOCKET);
_AFX_SOCK_THREAD_STATE*pState=_afxSockThreadState;
ASSERT(pState->m_hSocketWindow!=NULL);
returnWSAAsyncSelect(m_hSocket,pState->m_hSocketWindow,
WM_SOCKET_NOTIFY,lEvent)!=SOCKET_ERROR;
}
hán shù cān shù lEvent biǎo shì xī wàng jiān shì de wǎng luò shì jiàn。
_afxSockThreadState dé dào de shì dāng qián de mó kuài xiàn chéng zhuàng tài, m_hSocketWindow shì běn mó kuài zài dāng qián xiàn chéng de“ socket chuāng kǒu”, zhǐ dìng jiān shì m_hSocket de wǎng luò shì jiàn, rú zhǐ dìng shì jiàn fā shēng, gěi chuāng kǒu m_hSocketWindow fā sòng WM_SOCKET_NOTIFY xiāo xī。
bèi zhǐ dìng de wǎng luò shì jiàn duì yìng de wǎng luò I/O jiāng shì yì bù cāo zuò, shì fēi zǔsè cāo zuò。 lì rú: zhǐ dìng FR_READ dǎo zhì Receive shì yī gè yì bù cāo zuò, rú guǒ bù néng lì jí dú dào shù jù, zé fǎn huí yī gè cuò wù WSAEWOULDBLOCK。 zài shù jù dào dá zhī hòu, WinSock tōng zhī chuāng kǒu m_hSocketWindow, dǎo zhì OnReceive bèi diào yòng。
zhǐ dìng FR_WRITE dǎo zhì Send shì yī gè yì bù cāo zuò, jí shǐ shù jù méi yòu sòng chū yě fǎn huí yī gè cuò wù WSAEWOULDBLOCK。 zài shù jù kě yǐ fā sòng zhī hòu, WinSock tōng zhī chuāng kǒu m_hSocketWindow, dǎo zhì OnSend bèi diào yòng。
zhǐ dìng FR_CONNECT dǎo zhì Connect shì yī gè yì bù cāo zuò, hái méi yòu lián jiē shàng jiù fǎn huí cuò wù xìn xī WSAEWOULDBLOCK, zài lián jiē wán chéng zhī hòu, WinSock tōng zhī chuāng kǒu m_hSocketWindow, dǎo zhì OnConnect bèi diào yòng。
duì yú qí tā wǎng luò shì jiàn, jiù bù yī yī jiě shì liǎo。
suǒ yǐ, shǐ yòng CAsyncSocket shí, rú guǒ shǐ yòng Create quē shěng chuàng jiàn socket, zé suǒ yòu wǎng luò I/O dōushì yì bù cāo zuò, jìn xíng yòu guān wǎng luò I/O shí zé bì xū fù gài yǐ xià de xiāng guān hán shù:
OnAccept、 OnClose、 OnConnect、 OnOutOfBandData、 OnReceive、 OnSend。
( 5) Bind hán shù
jīng guò shàng shù guò chéng, socket chuàng jiàn wán bì, xià miàn, diào yòng Bind hán shù gěi m_hSocket zhǐ dìng běn dì duān kǒu hé IP dì zhǐ。 Bind de shí xiàn rú xià:
BOOLCAsyncSocket::Bind(UINTnSocketPort,LPCTSTRlpszSocketAddress)
{
USES_CONVERSION;
// shǐ yòng WinSock de dì zhǐ jié gòu gòu zào dì zhǐ xìn xī
SOCKADDR_INsockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
// dé dào dì zhǐ cān shù de zhí
LPSTRlpszAscii=T2A((LPTSTR)lpszSocketAddress);
// zhǐ dìng shì Internet dì zhǐ lèi xíng
sockAddr.sin_family=AF_INET;
if(lpszAscii==NULL)
// méi yòu zhǐ dìng dì zhǐ, zé zì dòng dé dào yī gè běn dì IP dì zhǐ
// bǎ 32 bǐ tè de shù jù cóng zhù jī zì jié xù zhuǎn huàn chéng wǎng luò zì jié xù
sockAddr.sin_addr.s_addr=htonl(INADDR_ANY);
else
{
// dé dào dì zhǐ
DWORDlResult=inet_addr(lpszAscii);
if(lResult==INADDR_NONE)
{
WSASetLastError(WSAEINVAL);
returnFALSE;
}
sockAddr.sin_addr.s_addr=lResult;
}
// rú guǒ duān kǒu wéi 0, zé WinSock fēn pèi yī gè duān kǒu( 1024 héng 5000)
// bǎ 16 bǐ tè de shù jù cóng zhù jī zì jié xù zhuǎn huàn chéng wǎng luò zì jié xù
sockAddr.sin_port=htons((u_short)nSocketPort);
//Bind diào yòng WinSockAPI hán shù bind
returnBind((SOCKADDR*)&sockAddr,sizeof(sockAddr));
}
qí zhōng: hán shù cān shù 1 zhǐ dìng liǎo duān kǒu; cān shù 2 zhǐ dìng liǎo yī gè bāo hán běn dì dì zhǐ de zì fú chuàn, quē shěng shì NULL。
hán shù Bind shǒu xiān shǐ yòng jié gòu SOCKADDR_IN gòu zào dì zhǐ xìn xī。 gāi jié gòu de yù sin_family biǎo shì dì zhǐ gé shì( TCP/IP tóng xié yì zú), fù zhí wéi AF_INET( Internet dì zhǐ gé shì); yù sin_port biǎo shì duān kǒu, rú guǒ cān shù 1 wéi 0, zé WinSock fēn pèi yī gè duān kǒujǐ tā, fàn wéi zài 1024 hé 5000 zhī jiān; yù sin_addr shì biǎo shì dì zhǐ xìn xī, tā shì yī gè lián hé tǐ, qí zhōng s_addr biǎo shì rú xià xíng shì de zì fú chuàn,“ 28.56.22.8”。 rú guǒ cān shù méi yòu zhǐ dìng dì zhǐ, zé WinSock zì dòng dì dé dào běn dì IP dì zhǐ( rú guǒ yòu jǐ gè wǎng kǎ, zé shǐ yòng qí zhōng yī gè de dì zhǐ)。
( 6) zǒng jié Create de guò chéng
shǒu xiān, diào yòng socket hán shù chuàng jiàn yī gè socket; rán hòu bǎ chuàng jiàn de socket duì xiàng yìng shè dào CAsyncSocket duì xiàng( kǔn bǎng zài yī qǐ), zhǐ dìng běn socket yào tōng zhī de wǎng luò shì jiàn, bìng chuàng jiàn yī gè“ socket chuāng kǒu” lái jiē shōu wǎng luò shì jiàn xiāo xī, zuì hòu, zhǐ dìng socket de běn dì xìn xī。
xià yī bù, shì shǐ yòng chéng yuán hán shù Connect lián jiē yuǎn dì zhù jī, pèi zhì socket de yuǎn dì xìn xī。 hán shù Connect lèi sì yú Bind, bǎ zhǐ dìng de yuǎn dì dì zhǐ zhuǎn huàn chéng SOCKADDR_IN duì xiàng biǎo shì de dì zhǐ xìn xī( bāo kuò wǎng luò zì jié xù de zhuǎn huàn), rán hòu diào yòng WinSock hán shù Connect lián jiē yuǎn dì zhù jī, pèi zhì socket de yuǎn dì duān kǒu hé yuǎn dì IP dì zhǐ。 |
|
|