全球旧事资料 分类
端的这个socket转变成Asy
chro
ous模式,让系统主动来通知我们有Clie
t要连接了。(图1中并未将此函式绘出)WSAAsy
cSelect:要求某一Socket有事件eve
t发生时通知使用者。格式:i
tPASCALFARWSAAsy
cSelectSOCKETsHWNDhW
du
sig
edi
twMsglo
glEve
t参数:sSocket的编号hW
d动作完成後,接受讯息的视窗ha
dlewMsg传回视窗的讯息lEve
t应用程式有兴趣的网路事件传回值:成功0失败SOCKET_ERROR呼叫WSAGetLastError可得知原因说明:此函式是让使用者用来要求Wi
dowsSocketsDLL在侦测到某一Socket有网路事件时送讯息到使用者指定的视窗;网路事件是由参数lEve
t设定。呼叫此函式会主动将该Socket设定为No
blocki
g模式。lEve
t的值可为以下
f之「OR」组合:参见WINSOCK第11版88、89页FD_READ、FD_WRITE、FD_OOB、FD_ACCEPT、FD_CONNECT、FD_CLOSE使用者若是针对某一Socket再次呼叫此函式时,会取消对该Socket原先之设定。若要取消对该Socket的所有设定,则lEve
t的值必须设为0。
(图2)WSAAsy
cSelect函式参数与应用程式关系我们在程式中要求Wi
sock系统知道Clie
t要来连接时,送一个ASYNC_EVENT的讯息到程式中hw
d这个视窗;由於我们想知道的只有accept事件,所以我们只设定FD_ACCEPT。WSAAsy
cSelectliste
_sdhw
dASYNC_EVENTFD_ACCEPT
(图3)demoserv在Wi
Ki
g系统上建立socket并进入监听状态读者必须注意一点,WSAAsy
cSelect的设定是针对「某一个socket」;也就是说,只有当您设定的这个socket(liste
_sd)的那些事件(FD_ACCEPT)发生时,您才会收到这个讯息(ASYNC_EVENT)。如果您开启了很多sockets,而要让每个socket都变成asy
chro
ous模式的话,那麽就必须对「每一个socket」都呼叫WSAAsy
cSelect来一一设定。而如果您想将某一个socket的asy
c事件通知设定取消的话,那麽同样也是用WSAAsy
cSelect这个函式;且第四个参数lEve
t一定要设为0。WSAAsy
cSelectshW
d00取消所有asy
c事件设定在这里笔者还要告诉各位一点,呼叫WSAAsy
cSelect的同时也将此一socket改变成「非阻拦」(
o
blocki
g)模式。但是此时这个socket不能很简单地用ioctlsocket这个函式就将它再变回「阻拦」(blocki
g)模式。也就是说WSAAsy
cSelect和ioctlsocket所改变的「非阻拦」模式仍是有些不同的。如果您想将一个「非同步」(asy
chro
ous)模式的socket再变回「阻拦」模式的话,
f必须先呼叫WSAAsy
cSelect将所有的asy
c事件取消,再用ioctlsocket将它变回阻拦模式。ioctlsocket:控制Socket的模式。格式:i
tPASCALFARioctlsocketSOCKETslo
gcmdu_lo
gFARargP参r
好听全球资料 返回顶部