å¨ç¼ç¨çè¿ç¨ä¸ï¼ç»å¸¸ä¼éå°è®¸å¤é»å¡çå½æ°ï¼å¥½åreadåç½ç»ç¼ç¨æ¶ä½¿ç¨çrecv, recvfromå½æ°é½æ¯é»å¡çå½æ°ï¼å½å½æ°ä¸è½æåæ§è¡çæ¶åï¼ç¨åºå°±ä¼ä¸ç´é»å¡å¨è¿éï¼æ æ³æ§è¡ä¸é¢ç代ç ãè¿æ¯å°±éè¦ç¨å°éé»å¡çç¼ç¨æ¹å¼ï¼ä½¿ç¨selcetå½æ°å°±å¯ä»¥å®ç°éé»å¡ç¼ç¨ã
selcetå½æ°æ¯ä¸ä¸ªè½®å¾ªå½æ°ï¼å³å½å¾ªç¯è¯¢é®æ件èç¹ï¼å¯è®¾ç½®è¶
æ¶æ¶é´ï¼è¶
æ¶æ¶é´å°äºå°±è·³è¿ä»£ç 继ç»å¾ä¸æ§è¡ã
Selectçå½æ°æ ¼å¼ï¼
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);
selectå½æ°æ5个åæ°
第ä¸ä¸ªæ¯æææ件èç¹çæ大å¼å 1,å¦æææä¸ä¸ªæ件èç¹1ã4ã6,é£ç¬¬ä¸ä¸ªåæ°å°±ä¸º7ï¼6+1ï¼
第äºä¸ªæ¯å¯è¯»æ件èç¹éï¼ç±»å为fd_setãéè¿FD_ZERO(&readfd);åå§åèç¹éï¼ç¶åéè¿FD_SET(fd, &readfd);æéè¦çå¬æ¯å¦å¯è¯»çèç¹å å
¥èç¹é
第ä¸ä¸ªæ¯å¯åæ件èç¹éä¸ï¼ç±»å为fd_setãæä½æ¹æ³å第äºä¸ªåæ°ä¸æ ·ã
第å个åæ°æ¯æ£æ¥èç¹é误éã
第äºä¸ªåæ°æ¯è¶
æ¶åæ°ï¼ç±»å为struct timevalï¼ç¶åå¯ä»¥è®¾ç½®è¶
æ¶æ¶é´ï¼åå«å¯è®¾ç½®ç§timeout.tv_secå
å¾®ç§timeout.tv_usecã
ç¶åè°ç¨selectå½æ°ï¼ç¨FD_ISSET()å½æ°å¤æèç¹æ¯å¦å¯è¯»åã
è¿åå¼ä¸ä¸º0表示å¯è¯»åï¼ä¸º0表示ä¸å¯è¯»åãselectå½æ°çè¿åå¼ä¸ºæ¯ä¸ä¸ªæ´æ°ï¼è¡¨ç¤ºæå 个èç¹å¯è¯»åã
å
说æ两个ç»æä½ï¼
第ä¸ï¼struct fd_setå¯ä»¥ç解为ä¸ä¸ªéåï¼è¿ä¸ªéåä¸åæ¾çæ¯
æ件æ述符(filedescriptor)ï¼å³æ件å¥æï¼è¿å¯ä»¥æ¯æ们æ说çæ®éæä¹çæ件ï¼å½ç¶Unixä¸ä»»ä½è®¾å¤ã管éãFIFOçé½æ¯æ件形å¼ï¼å
¨é¨å
æ¬å¨å
ï¼æ以毫æ çé®ä¸ä¸ªsocketå°±æ¯ä¸ä¸ªæ件ï¼socketå¥æå°±æ¯ä¸ä¸ªæ件æ述符ãfd_setéåå¯ä»¥éè¿ä¸äºå®ç±äººä¸ºæ¥æä½ï¼æ¯å¦æ¸
空éåFD_ZERO(fd_set *)ï¼å°ä¸ä¸ªç»å®çæ件æ述符å å
¥éåä¹ä¸FD_SET(int ,fd_set*)ï¼å°ä¸ä¸ªç»å®çæ件æ述符ä»éåä¸å é¤FD_CLR(int,fd_set*)ï¼æ£æ¥éåä¸æå®çæ件æ述符æ¯å¦å¯ä»¥è¯»åFD_ISSET(int ,fd_set* )ã
第äºï¼struct timevalæ¯ä¸ä¸ªå¤§å®¶å¸¸ç¨çç»æï¼ç¨æ¥ä»£è¡¨æ¶é´å¼ï¼æ两个æåï¼ä¸ä¸ªæ¯ç§æ°ï¼å¦ä¸ä¸ªæ¯æ¯«ç§æ°ã
å
·ä½è§£éselectçåæ°ï¼
int maxfdpæ¯ä¸ä¸ªæ´æ°å¼ï¼æ¯æéåä¸æææ件æ述符çèå´ï¼å³æææ件æ述符çæ大å¼å 1ï¼ä¸è½éï¼å¨Windowsä¸è¿ä¸ªåæ°çå¼æ æè°ï¼å¯ä»¥è®¾ç½®ä¸æ£ç¡®ã
fd_set * readfdsæ¯æåfd_setç»æçæéï¼è¿ä¸ªéåä¸åºè¯¥å
æ¬æ件æ述符ï¼æ们æ¯è¦çè§è¿äºæ件æ述符ç读ååçï¼å³æ们å
³å¿æ¯å¦å¯ä»¥ä»è¿äºæ件ä¸è¯»åæ°æ®äºï¼å¦æè¿ä¸ªéåä¸æä¸ä¸ªæ件å¯è¯»ï¼selectå°±ä¼è¿åä¸ä¸ªå¤§äº0çå¼ï¼è¡¨ç¤ºææ件å¯è¯»ï¼å¦æ没æå¯è¯»çæ件ï¼åæ ¹æ®timeoutåæ°åå¤ææ¯å¦è¶
æ¶ï¼è¥è¶
åºtimeoutçæ¶é´ï¼selectè¿å0ï¼è¥åçé误è¿åè´å¼ãå¯ä»¥ä¼ å
¥NULLå¼ï¼è¡¨ç¤ºä¸å
³å¿ä»»ä½æ件ç读ååã
fd_set * writefdsæ¯æåfd_setç»æçæéï¼è¿ä¸ªéåä¸åºè¯¥å
æ¬æ件æ述符ï¼æ们æ¯è¦çè§è¿äºæ件æ述符çåååçï¼å³æ们å
³å¿æ¯å¦å¯ä»¥åè¿äºæ件ä¸åå
¥æ°æ®äºï¼å¦æè¿ä¸ªéåä¸æä¸ä¸ªæ件å¯åï¼selectå°±ä¼è¿åä¸ä¸ªå¤§äº0çå¼ï¼è¡¨ç¤ºææ件å¯åï¼å¦æ没æå¯åçæ件ï¼åæ ¹æ®timeoutåæ°åå¤ææ¯å¦è¶
æ¶ï¼è¥è¶
åºtimeoutçæ¶é´ï¼selectè¿å0ï¼è¥åçé误è¿åè´å¼ãå¯ä»¥ä¼ å
¥NULLå¼ï¼è¡¨ç¤ºä¸å
³å¿ä»»ä½æ件çåååã
fd_set * errorfdsåä¸é¢ä¸¤ä¸ªåæ°çæå¾ï¼ç¨æ¥çè§æ件é误å¼å¸¸ã
struct timeval * timeoutæ¯selectçè¶
æ¶æ¶é´ï¼è¿ä¸ªåæ°è³å
³éè¦ï¼å®å¯ä»¥ä½¿selectå¤äºä¸ç§ç¶æï¼ç¬¬ä¸ï¼è¥å°NULL以形åä¼ å
¥ï¼å³ä¸ä¼ å
¥æ¶é´ç»æï¼å°±æ¯å°selectç½®äºé»å¡ç¶æï¼ä¸å®çå°çè§æ件æ述符éåä¸æ个æ件æ述符åçåå为æ¢ï¼ç¬¬äºï¼è¥å°æ¶é´å¼è®¾ä¸º0ç§0毫ç§ï¼å°±åæä¸ä¸ªçº¯ç²¹çéé»å¡å½æ°ï¼ä¸ç®¡æ件æ述符æ¯å¦æååï¼é½ç«å»è¿å继ç»æ§è¡ï¼æ件æ ååè¿å0ï¼æååè¿åä¸ä¸ªæ£å¼ï¼ç¬¬ä¸ï¼timeoutçå¼å¤§äº0ï¼è¿å°±æ¯çå¾
çè¶
æ¶æ¶é´ï¼å³selectå¨timeoutæ¶é´å
é»å¡ï¼è¶
æ¶æ¶é´ä¹å
æäºä»¶å°æ¥å°±è¿åäºï¼å¦åå¨è¶
æ¶åä¸ç®¡ææ ·ä¸å®è¿åï¼è¿åå¼åä¸è¿°ã
è¿åå¼ï¼è¿åç¶æåçååçæ述符æ»æ°ã
è´å¼ï¼selecté误
æ£å¼ï¼æäºæ件å¯è¯»åæåºé
0ï¼çå¾
è¶
æ¶ï¼æ²¡æå¯è¯»åæé误çæ件